设为首页 收藏本站
查看: 1335|回复: 0

[经验分享] 第三节 MongoDB插入和批量插入,插入原理

[复制链接]

尚未签到

发表于 2015-7-5 14:31:51 | 显示全部楼层 |阅读模式
  在开发之前,选择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#驱动 添加文档

DSC0000.gif DSC0001.gif 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         ///
40         /// 单个对象插入
41         ///
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         ///
74         /// 批量插入
75         ///
76         public void InsertBatchLogin()
77         {
78             var Time = DateTime.Now.ToUniversalTime();
79             List logins = new List();
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.iyunv.com/yoolonet
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83425-1-1.html 上篇帖子: windows下mongodb安装与使用整理 下篇帖子: MongoDB权威指南(7)- Administration
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表