在开发之前,选择MongoDb驱动是件很重要的事情。如果选择不好,在后期的开发的是件很费力的事情,因为我就遇到这样的问题。MongoDb驱动有几种比较流行驱动,官方驱动和samus是两种使用比较多的。
好了,接着说今天的内容了。
首先从MongoDb的官方网站上下载CSharp驱动()。我使用的是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集合中mycmyc1myc2system.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请求,也就是避免了多个请求带来的开销!
如果要看更多,请访问我之前的
作者:
出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接