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#驱动 添加文档

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插入和批量插入,插入原理的更多相关文章
- MySql快速插入以及批量更新
MySql快速插入以及批量更新 插入: MySql提供了可以一次插入多条数据的用法: [sql] INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6), ...
- MongoDB与传统数据库的使用区别——批量插入与批量查询
我在百X知道上回答问题时经常遇到类似与这样的问题:MongoDB有没有像MySQL一样的ODBC驱动?MongoDB能不能像MySQL一样获取字段名称或类型. 我的回答是:不行,因为MongoDB不是 ...
- mybatis的插入与批量插入的返回ID的原理
目录 背景 底层调用方法 单个对象插入 列表批量插入 完成 背景 最近正在整理之前基于mybatis的半ORM框架.原本的框架底层类ORM操作是通过StringBuilder的append拼接的,这次 ...
- 【转】MySQL批量SQL插入各种性能优化
原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...
- jdbc-批量插入、批量删除、批量更新
一.JDBC的批量插入 JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等. 我用Mysql5.1.5的JDBC driver 分别对三种比较常用的方法做了测试 方法 ...
- mybatis单个插入和批量插入的简单比较
在J2EE项目中,mybatis作为主流持久层框架,许多知识值得我们去钻研学习,今天,记录一下数据插入性能(单个插入和批量插入). 一,测试对象 public class Test { private ...
- spring data jpa开启批量插入、批量更新
spring data jpa开启批量插入.批量更新 原文链接:https://www.cnblogs.com/blog5277/p/10661096.html 原文作者:博客园--曲高终和寡 *** ...
- JMeter 利用Jmeter批量数据库插入数据
利用Jmeter批量数据库插入数据 by:授客 QQ:1033553122 1. 启动Jmeter 2. 添加 DBC Connection Configuration 右键线程组-> ...
- Jedis使用管道优化批量输出插入的效率
Jedis连接池: package com.daxin.jedis_datastructure; /** * * @author daxin * * @email leodaxin@163com * ...
- 寻找 IBatisNet 批量插入(批量复制) 的心路历程
1.IBatisNet本身就是一个比较早的ORM框架,再加上是从java iBatis移值过来的,其流行程度不是特别高资料也不是很多(一年前),不过最近好像搜索比较多了一些(可能是训练的结果吧) 2. ...
随机推荐
- hbase的存储体系
一.了解hbase的存储体系. hbase的存储体系核心的有Split机制,Flush机制和Compact机制. 1.split机制 每一个hbase的table表在刚刚开始的时候,只有一个regio ...
- 扩展欧几里得算法(extended Euclidean algorithm)的一个常犯错误
int exGcd(int x,int y,int& a,int& b) //ax+by=gcd(x,y) { ; b=; return x; } int res=exGcd(y,x% ...
- MS SQL SERVER 2008 R2 实例服务启动出现10048错误解决办法
由于个人癖好,把MSSQLSERVER服务禁止了开机启动,每次需要的时候就输入CMD命令开启.今天在开启的时候,系统提示“发生服务特定错误:10048”. 于是打开SQL Server配置管理器,发现 ...
- js时间戳与日期格式之间的互转
1. 将时间戳转换成日期格式 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 注意:如果是uinx时间戳记得乘于1000.比如php函数time()获得 ...
- 安卓AVD使用建议
问题描述:之前在安装了Android开发环境后,一开始并没有直接在Android手机和平板上进行调试,是使用的AVD模拟器工具.由于电脑的配置不是特别好,总感觉AVD的使用速度太慢,包括启动的时候还有 ...
- linux系统删除空间后系统分区空间仍不释放问题
总结的原因: 1.删除文件文件后没有清空回收站; 2.删除的文件不在系统分区,在其他分区上; 3.删除的文件被保留在了/tmp分区下,而/tmp分区不是独立的分区,是在根分区/的基础上划分出来的分区; ...
- Python自动化运维之23、Dom
文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.最为关心的是,DOM把网页 ...
- 代码之美——Doom3源代码赏析2
http://www.csdn.net/article/2013-01-17/2813778-the-beauty-of-doom3-source-code/2 摘要:Dyad作者.资深C++工程师S ...
- hadoop 异常 INFO ipc.Client: Retrying connect to server:
// :: INFO ipc.Client: Retrying connect to server: master/. Already tried , sleepTime= SECONDS) // : ...
- BZOJ 1019 汉诺塔
Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操 ...