在开发之前,选择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

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

c# MongoDB插入和批量插入,插入原理的更多相关文章

  1. MySql快速插入以及批量更新

    MySql快速插入以及批量更新 插入: MySql提供了可以一次插入多条数据的用法: [sql] INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6), ...

  2. MongoDB与传统数据库的使用区别——批量插入与批量查询

    我在百X知道上回答问题时经常遇到类似与这样的问题:MongoDB有没有像MySQL一样的ODBC驱动?MongoDB能不能像MySQL一样获取字段名称或类型. 我的回答是:不行,因为MongoDB不是 ...

  3. mybatis的插入与批量插入的返回ID的原理

    目录 背景 底层调用方法 单个对象插入 列表批量插入 完成 背景 最近正在整理之前基于mybatis的半ORM框架.原本的框架底层类ORM操作是通过StringBuilder的append拼接的,这次 ...

  4. 【转】MySQL批量SQL插入各种性能优化

    原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...

  5. jdbc-批量插入、批量删除、批量更新

    一.JDBC的批量插入 JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等.    我用Mysql5.1.5的JDBC driver 分别对三种比较常用的方法做了测试   方法 ...

  6. mybatis单个插入和批量插入的简单比较

    在J2EE项目中,mybatis作为主流持久层框架,许多知识值得我们去钻研学习,今天,记录一下数据插入性能(单个插入和批量插入). 一,测试对象 public class Test { private ...

  7. spring data jpa开启批量插入、批量更新

    spring data jpa开启批量插入.批量更新 原文链接:https://www.cnblogs.com/blog5277/p/10661096.html 原文作者:博客园--曲高终和寡 *** ...

  8. JMeter 利用Jmeter批量数据库插入数据

    利用Jmeter批量数据库插入数据   by:授客 QQ:1033553122 1.   启动Jmeter 2.   添加 DBC Connection Configuration 右键线程组-> ...

  9. Jedis使用管道优化批量输出插入的效率

    Jedis连接池: package com.daxin.jedis_datastructure; /** * * @author daxin * * @email leodaxin@163com * ...

  10. 寻找 IBatisNet 批量插入(批量复制) 的心路历程

    1.IBatisNet本身就是一个比较早的ORM框架,再加上是从java iBatis移值过来的,其流行程度不是特别高资料也不是很多(一年前),不过最近好像搜索比较多了一些(可能是训练的结果吧) 2. ...

随机推荐

  1. 英语学习[ZZ]

    本文作者三年间从四级勉强及格到高级口译笔试210,口试232.找工作面试时给其口试的老外考官听了一分钟就说你的英语不用考了.虽不敢说方法一定是最好的,但从现在开始随便谁不要再去找学习资料,每天花两个钟 ...

  2. Codeforces 474E - Pillars

    一眼看上去非常像最长不下降子序列. 然后比赛的时候对每个答案长度为k的序列,维护最后一个数的最大值和最小值. 当时不知道为什么认为从长度最长倒推至前面不会太长,于是心满意足地敲了个O(n^2).结果T ...

  3. 【POJ2985】【Treap + 并查集】The k-th Largest Group

    Description Newman likes playing with cats. He possesses lots of cats in his home. Because the numbe ...

  4. 寒假挑战PythonTip(一人一python)总结——算法是程序的灵魂,程序员的心法

        2014年2月中旬,我上升到挑战python英雄榜第3名.这是我寒假修炼算法的成果之一.来一下总结吧! Linux的创始人Linus Torvalds在一次演讲中有一段涉及“什么才是优秀程序员 ...

  5. PHP数据库

    目录 1.创建数据库连接 2.创建数据库 3.选择数据库 4.设置当前连接使用的字符编码 5.创建表 6.插入数据 7.取得数据查询结果 8.关闭连接 1.创建数据库连接 //mysql_connec ...

  6. Bootstrap_Javascript_固定定位

    Affix 插件可以对任何元素进行固定定位,其中比较简单的方法,就是通过自定义属性 data 来触发.其主要包括两个参数: 1.data-spy:取值 affix,表示元素固定不变的. 2.data- ...

  7. JS 返回上一步(退回上一步上一个网页)

    链接式: <a href="JavaScript:history.go(-1)">返回上一步</a> <a href="<%=Requ ...

  8. Python字符编码讲解

    声明:本文参考 Python字符编码详解 在计算机中我们不管用什么语言和程序,最终数据在计算机中的都是字节码(也就是01形式)的形式存在的,如果 计算机直接把字节码显示在屏幕上,很明显一般人看不懂字节 ...

  9. Java JPA 查询实体部分字段

    前言 相信大家在用Java JPA作为ORM的时候都会有这种困惑,就是某个表T我仅仅希望取到其中的A.B.C三个字段,可是jpa是通过Entity Class映射的方式组合查询结果的. 那么如何通过使 ...

  10. 延长FLASH和EEPROM芯片写入次数的小方法

    开发电子产品时,常常需要断电后保存某些数据,这就需要使用 FLASH或EEPROM芯片,这两种芯片,可擦除的次数是有限制的,通常FLASH为10万次,EEPROM要多一点,为100万甚至1000万次. ...