标题 | 说说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#驱动 添加文档 #region Version Info /* ======================================================================== * 【说明描述】 * * 作者:yoolo 时间:2011/8/29 21:15:38 * 文件名:NoSpiderAuto.LoginDemo * 版本:V1.0.1 * * 修改者: 时间: * 修改说明: * ======================================================================== */ #endregion namespace NoSpiderAuto { using System; using System.Collections.Generic; using System.Linq; using System.Text; using MongoDB.Driver; using MongoDB.Bson; internal class LoginDemo { MongoDatabase db; MongoCollection coll; public LoginDemo() { MongoServerSettings set = new MongoServerSettings() { Server = new MongoServerAddress("127.0.0.1") }; MongoServer server = new MongoServer(set); db = server.GetDatabase("testDb"); coll = db.GetCollection("login"); } /// <summary> /// 单个对象插入 /// </summary> public void InsertLogin() { var Time = DateTime.Now.ToUniversalTime(); //实例一 添加匿名对象 var login = new { _id = "newid_100002", time = Time, userid = 10002, sessionid = "20110829215102", ip = "192.168.0.2", title = "注册", url = "Register.aspx" }; coll.Insert(login);//插入成功 //添加一个BsonDocument对象 BsonDocument doc = new BsonDocument(); doc.Add("_id", BsonValue.Create("newid_100003")); doc.Add("time", BsonValue.Create(Time)); doc.Add("userid", BsonValue.Create(10003)); doc.Add("sessionid", BsonValue.Create("20110829215103")); doc.Add("ip", BsonValue.Create("192.168.0.3")); doc.Add("title", BsonValue.Create("注册")); doc.Add("url", BsonValue.Create("Register.aspx")); coll.Insert(doc);//插入成功 //添加一个对象 Login man = new Login(); man._id = "newid_100004"; man.time = Time; man.userid = 10004; man.sessionid = "20110829215104"; man.ip = "192.168.0.4"; man.title = "注册"; man.url = "Register.aspx"; coll.Insert(man);//插入成功 } /// <summary> /// 批量插入 /// </summary> public void InsertBatchLogin() { var Time = DateTime.Now.ToUniversalTime(); List<Login> logins = new List<Login>(); for (int i = 0; i < 100; i++) { Login man = new Login(); man._id = "newid_100001" + i.ToString();//_id在批量插入的时候不能重复,如果有一个重复全部集合无法插入到集合 man.time = Time; man.userid = 10004 + i; man.sessionid = "20110829215104"; man.ip = "192.168.0.4"; man.title = "注册"; man.url = "Register.aspx"; logins.Add(man); } coll.InsertBatch(typeof(Login), logins); //插入成功 } } public class Login { public string _id { get; set; } public DateTime time { get; set; } public int userid { get; set; } public string sessionid { get; set; } public string ip { get; set; } public string title { get; set; } public string url { get; set; } } } 如果要插入多个文档,使用批量插入会快一些。一次批量插入只是单个Tcp请求,也就是避免了多个请求带来的开销! |
随便看 |
|
在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。