c# 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

> var time = new Date("2011/8/28 21:50:00") //定义一个时间对象
> var i = {"time":time,"userid":10001,"sessionid":"20110829215100","ip":"192.168.0.1","title":"Login","url":"Login.aspx"}  //定义一个文档对象
> i   //查看 i 文档
{
        "time" : ISODate("2011-08-28T13:50:00Z"),
        "userid" : 10001,
        "sessionid" : "20110829215100",
        "ip" : "192.168.0.1",
        "title" : "Login",
        "url" : "Login.aspx"
}
> use testDb
> show collections  //查看当前集合,把i文档插入到login集合中
myc
myc1
myc2
system.indexes
> db.login.insert(i)
> db.login.findOne()
{
        "_id" : ObjectId("4e5b99e62690d28cadd0f58d"), //MongoDb会为每个插入的对象自动生成一个"_id"的值,你可以在插入的时候自己指定这个值,如下面
        "time" : ISODate("2011-08-28T13:50:00Z"),
        "userid" : 10001,
        "sessionid" : "20110829215100",
        "ip" : "192.168.0.1",
        "title" : "Login",
        "url" : "Login.aspx"
}
> i = {"_id":"newid_100001","time":time,"userid":10001,"sessionid":"20110829215100","ip":"192.168.0.1","title":"Login","url":"Login.aspx"}
{
        "_id" : "newid_100001",
        "time" : ISODate("2011-08-28T13:50:00Z"),
        "userid" : 10001,
        "sessionid" : "20110829215100",
        "ip" : "192.168.0.1",
        "title" : "Login",
        "url" : "Login.aspx"
}
> db.login.save(i) //这里用save插入文档到数据库
> db.login.find()  //查询结果两条文档,第二条文档"_id"是自定义的值
{ "_id" : ObjectId("4e5b99e62690d28cadd0f58d"), "time" : ISODate("2011-08-28T13:50:00Z"), "userid" : 10001, "sessionid" : "20110829215100",
"ip" : "192.168.0.1", "title" : "Login", "url" : "Login.aspx" }
{ "_id" : "newid_100001", "time" : ISODate("2011-08-28T13:50:00Z"), "userid" : 10001, "sessionid" : "20110829215100", "ip" : "192.168.0.1",
"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  {
 17       using  System;
 18       using  System.Collections.Generic;
 19       using  System.Linq;
 20       using  System.Text;
 21       using  MongoDB.Driver;
 22       using  MongoDB.Bson;
 23 
 24       internal   class  LoginDemo
 25      {
 26          MongoDatabase db;
 27          MongoCollection coll;
 28           public  LoginDemo()
 29          {
 30              MongoServerSettings  set   =   new  MongoServerSettings()
 31              {
 32                  Server  =   new  MongoServerAddress( " 127.0.0.1 " )
 33              };
 34              MongoServer server  =   new  MongoServer( set );
 35              db  =  server.GetDatabase( " testDb " );
 36              coll  =  db.GetCollection( " login " );
 37          }
 38 
 39           ///   <summary>
 40           ///  单个对象插入
 41           ///   </summary>
 42           public   void  InsertLogin()
 43          {
 44              var Time  =  DateTime.Now.ToUniversalTime();
 45 
 46               // 实例一 添加匿名对象
 47              var login  =   new  { _id  =   " newid_100002 " , time  =  Time, userid  =   10002 , sessionid  =   " 20110829215102 " , ip  =   " 192.168.0.2 " , title  =   " 注册 " , url  =   " Register.aspx "  };
 48              coll.Insert(login); // 插入成功
 49 
 50               // 添加一个BsonDocument对象
 51              BsonDocument doc  =   new  BsonDocument();
 52              doc.Add( " _id " , BsonValue.Create( " newid_100003 " ));
 53              doc.Add( " time " , BsonValue.Create(Time));
 54              doc.Add( " userid " , BsonValue.Create( 10003 ));
 55              doc.Add( " sessionid " , BsonValue.Create( " 20110829215103 " ));
 56              doc.Add( " ip " , BsonValue.Create( " 192.168.0.3 " ));
 57              doc.Add( " title " , BsonValue.Create( " 注册 " ));
 58              doc.Add( " url " , BsonValue.Create( " Register.aspx " ));
 59              coll.Insert(doc); // 插入成功
 60 
 61               // 添加一个对象
 62              Login man  =   new  Login();
 63              man._id  =   " newid_100004 " ;
 64              man.time  =  Time;
 65              man.userid  =   10004 ;
 66              man.sessionid  =   " 20110829215104 " ;
 67              man.ip  =   " 192.168.0.4 " ;
 68              man.title  =   " 注册 " ;
 69              man.url  =   " Register.aspx " ;
 70              coll.Insert(man); // 插入成功
 71 
 72          }
 73           ///   <summary>
 74           ///  批量插入
 75           ///   </summary>
 76           public   void  InsertBatchLogin()
 77          {
 78              var Time  =  DateTime.Now.ToUniversalTime();
 79              List < Login >  logins  =   new  List < Login > ();
 80 
 81               for  ( int  i  =   0 ; i  <   100 ; i ++ )
 82              {
 83                  Login man  =   new  Login();
 84                  man._id  =   " newid_100001 "   +  i.ToString(); // _id在批量插入的时候不能重复,如果有一个重复全部集合无法插入到集合
 85                  man.time  =  Time;
 86                  man.userid  =   10004   +  i;
 87                  man.sessionid  =   " 20110829215104 " ;
 88                  man.ip  =   " 192.168.0.4 " ;
 89                  man.title  =   " 注册 " ;
 90                  man.url  =   " Register.aspx " ;
 91                  logins.Add(man);
 92              }
 93              coll.InsertBatch( typeof (Login), logins);  // 插入成功
 94          }
 95      }
 96 
 97       public   class  Login
 98      {
 99           public   string  _id {  get set ; }
100           public  DateTime time {  get set ; }
101           public   int  userid {  get set ; }
102           public   string  sessionid {  get set ; }
103           public   string  ip {  get set ; }
104           public   string  title {  get set ; }
105           public   string  url {  get set ; }
106      }
107  }
复制代码

 

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

       如果要看更多,请访问我之前的MongoDb系列文章    

      作者: Yoolo

      出处:http://www.cnblogs.com/yoolonet

      本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接

你可能感兴趣的:(mongodb)