zoukankan      html  css  js  c++  java
  • 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 { getset; }
    100         public DateTime time { getset; }
    101         public int userid { getset; }
    102         public string sessionid { getset; }
    103         public string ip { getset; }
    104         public string title { getset; }
    105         public string url { getset; }
    106     }
    107 }
    复制代码

     

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

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

          作者: Yoolo

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

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

  • 相关阅读:
    Python MySQLdb 学习总结
    开始机器学习
    KMS 激活office2013失败的解决办法 Error:0xC004F038
    读研了,很不爽
    网络爬虫抓取页面的一种存储方法
    使用python自带的xml.dom创建和解析xml
    【本科毕业设计论文】分布式网络爬虫的研究与实现
    基于iptables实现NAT的分析与应用
    线程池的研究及实现
    网络爬虫中,URL队列(URL Frontier)的设计与实现
  • 原文地址:https://www.cnblogs.com/zhwl/p/3508178.html
Copyright © 2011-2022 走看看