说说MongoDB的插入原理

在开发之前,选择MongoDB驱动是件很重要的事情。如果选择不好,在后期的开发的是件很费力的事情,因为我就遇到这样的问题。MongoDB驱动有几种比较流行驱动,官方驱动和samus是两种使用比较多的。

好了,接着说今天的内容了。

首先从MongoDB的官方网站上下载CSharp驱动(https://github.com/mongodb/mongo-csharp-driver/downloads)。我使用的是CSharpDriver-1.1.0.4184,里面还包含一个CSharpDriverDocs.chm的文档。

MongoDB插入原理:使用驱动程序进行插入的时候,会将数据转换成BSON格式。数据库会解析BSON,并检验是否含有“_id”键,因为“_id”键在插入到数据库时MongoDB会自动生成。而且每次插入文档不能超过4M。这个应该是和MongoDB本身有关。但是MongoDB1.8版本的支持16M,为什么是这个样子我到没怎么研究。这个想留给有心人帮忙解决下了。

插入的Shell操作有Insert和Save两种语法,先看下面的Shell

  1. > var time = new Date("2011/8/28 21:50:00"//定义一个时间对象 
  2. > var i = {"time":time,"userid":10001,"sessionid":"20110829215100","ip":"192.168.0.1","title":"Login","url":"Login.aspx"}  //定义一个文档对象 
  3. > i   //查看 i 文档 
  4.         "time" : ISODate("2011-08-28T13:50:00Z"), 
  5.         "userid" : 10001, 
  6.         "sessionid" : "20110829215100"
  7.         "ip" : "192.168.0.1"
  8.         "title" : "Login"
  9.         "url" : "Login.aspx" 
  10. > use testDb 
  11. > show collections  //查看当前集合,把i文档插入到login集合中 
  12. myc 
  13. myc1 
  14. myc2 
  15. system.indexes 
  16. > db.login.insert(i) 
  17. > db.login.findOne() 
  18.         "_id" : ObjectId("4e5b99e62690d28cadd0f58d"), //MongoDb会为每个插入的对象自动生成一个"_id"的值,你可以在插入的时候自己指定这个值,如下面 
  19.         "time" : ISODate("2011-08-28T13:50:00Z"), 
  20.         "userid" : 10001, 
  21.         "sessionid" : "20110829215100"
  22.         "ip" : "192.168.0.1"
  23.         "title" : "Login"
  24.         "url" : "Login.aspx" 
  25. > i = {"_id":"newid_100001","time":time,"userid":10001,"sessionid":"20110829215100","ip":"192.168.0.1","title":"Login","url":"Login.aspx"
  26.         "_id" : "newid_100001"
  27.         "time" : ISODate("2011-08-28T13:50:00Z"), 
  28.         "userid" : 10001, 
  29.         "sessionid" : "20110829215100"
  30.         "ip" : "192.168.0.1"
  31.         "title" : "Login"
  32.         "url" : "Login.aspx" 
  33. > db.login.save(i) //这里用save插入文档到数据库 
  34. > db.login.find()  //查询结果两条文档,第二条文档"_id"是自定义的值 
  35. "_id" : ObjectId("4e5b99e62690d28cadd0f58d"), "time" : ISODate("2011-08-28T13:50:00Z"), "userid" : 10001, "sessionid" : "20110829215100"
  36. "ip" : "192.168.0.1""title" : "Login""url" : "Login.aspx" } 
  37. "_id" : "newid_100001""time" : ISODate("2011-08-28T13:50:00Z"), "userid" : 10001, "sessionid" : "20110829215100""ip" : "192.168.0.1"
  38. "title" : "Login""url" : "Login.aspx" } 

注意:

1:Insert和Save的区别是:如果插入的集合的“_id”值,在集合中已经存在,用Insert执行插入操作回报异常,已经存在”_id”的键。用Save如果系统中没有相同的”_id”就执行插入操作,有的话就执行覆盖掉原来的值。相当于修改操作。我这里就不做演示了。

下面说下用C#驱动 添加文档。

2:在新建一个集合或者一个数据库时,MongoDb不会在马上生成。而是在你添加了第一个数据后才会有显示。这个特性很多的数据库都用,比如说SQLite。

下面说下用 C#驱动 添加文档

  1. #region Version Info 
  2. /* ========================================================================  
  3.     * 【说明描述】  
  4.     *   
  5.     * 作者:yoolo        时间:2011/8/29 21:15:38  
  6.     * 文件名:NoSpiderAuto.LoginDemo 
  7.     * 版本:V1.0.1  
  8.     *  
  9.     * 修改者:           时间:                
  10.     * 修改说明:  
  11.     * ========================================================================  
  12.   */ 
  13. #endregion 
  14.  
  15. namespace NoSpiderAuto 
  16.     using System; 
  17.     using System.Collections.Generic; 
  18.     using System.Linq; 
  19.     using System.Text; 
  20.     using MongoDB.Driver; 
  21.     using MongoDB.Bson; 
  22.  
  23.     internal class LoginDemo 
  24.     { 
  25.         MongoDatabase db; 
  26.         MongoCollection coll; 
  27.         public LoginDemo() 
  28.         { 
  29.             MongoServerSettings set = new MongoServerSettings() 
  30.             { 
  31.                 Server = new MongoServerAddress("127.0.0.1"
  32.             }; 
  33.             MongoServer server = new MongoServer(set); 
  34.             db = server.GetDatabase("testDb"); 
  35.             coll = db.GetCollection("login"); 
  36.         } 
  37.  
  38.         /// <summary> 
  39.         /// 单个对象插入 
  40.         /// </summary> 
  41.         public void InsertLogin() 
  42.         { 
  43.             var Time = DateTime.Now.ToUniversalTime(); 
  44.  
  45.             //实例一 添加匿名对象 
  46.             var login = new { _id = "newid_100002", time = Time, userid = 10002, sessionid = "20110829215102", ip = "192.168.0.2", title = "注册", url = "Register.aspx" }; 
  47.             coll.Insert(login);//插入成功 
  48.  
  49.             //添加一个BsonDocument对象 
  50.             BsonDocument doc = new BsonDocument(); 
  51.             doc.Add("_id", BsonValue.Create("newid_100003")); 
  52.             doc.Add("time", BsonValue.Create(Time)); 
  53.             doc.Add("userid", BsonValue.Create(10003)); 
  54.             doc.Add("sessionid", BsonValue.Create("20110829215103")); 
  55.             doc.Add("ip", BsonValue.Create("192.168.0.3")); 
  56.             doc.Add("title", BsonValue.Create("注册")); 
  57.             doc.Add("url", BsonValue.Create("Register.aspx")); 
  58.             coll.Insert(doc);//插入成功 
  59.  
  60.             //添加一个对象 
  61.             Login man = new Login(); 
  62.             man._id = "newid_100004"
  63.             man.time = Time; 
  64.             man.userid = 10004; 
  65.             man.sessionid = "20110829215104"
  66.             man.ip = "192.168.0.4"
  67.             man.title = "注册"
  68.             man.url = "Register.aspx"
  69.             coll.Insert(man);//插入成功 
  70.  
  71.         } 
  72.         /// <summary> 
  73.         /// 批量插入 
  74.         /// </summary> 
  75.         public void InsertBatchLogin() 
  76.         { 
  77.             var Time = DateTime.Now.ToUniversalTime(); 
  78.             List<Login> logins = new List<Login>(); 
  79.  
  80.             for (int i = 0; i < 100; i++) 
  81.             { 
  82.                 Login man = new Login(); 
  83.                 man._id = "newid_100001" + i.ToString();//_id在批量插入的时候不能重复,如果有一个重复全部集合无法插入到集合 
  84.                 man.time = Time; 
  85.                 man.userid = 10004 + i; 
  86.                 man.sessionid = "20110829215104"
  87.                 man.ip = "192.168.0.4"
  88.                 man.title = "注册"
  89.                 man.url = "Register.aspx"
  90.                 logins.Add(man); 
  91.             } 
  92.             coll.InsertBatch(typeof(Login), logins); //插入成功 
  93.         } 
  94.     } 
  95.  
  96.     public class Login 
  97.     { 
  98.         public string _id { getset; } 
  99.         public DateTime time { getset; } 
  100.         public int userid { getset; } 
  101.         public string sessionid { getset; } 
  102.         public string ip { getset; } 
  103.         public string title { getset; } 
  104.         public string url { getset; } 
  105.     } 

如果要插入多个文档,使用批量插入会快一些。一次批量插入只是单个Tcp请求,也就是避免了多个请求带来的开销!

原文链接:http://www.cnblogs.com/yoolonet/archive/2011/08/29/2158966.html#

【编辑推荐】

  1. MongoDB之父:MongoDB胜过BigTable
  2. 主流NoSQL数据库全方位评测之MongoDB
  3. 教你如何利用MySQL学习MongoDB
  4. 在Windows环境下MongoDB搭建和简单操作
  5. Mongodb源码分析之Mongos分析

 

 

 

 

 

 

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/294795.html<

(0)
管理的头像管理
上一篇2025-05-21 06:08
下一篇 2025-05-21 06:09

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注