博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# MongoDB插入和批量插入,插入原理
阅读量:6087 次
发布时间:2019-06-20

本文共 5263 字,大约阅读时间需要 17 分钟。

 在开发之前,选择MongoDb驱动是件很重要的事情。如果选择不好,在后期的开发的是件很费力的事情,因为我就遇到这样的问题。MongoDb驱动有几种比较流行驱动,官方驱动和samus是两种使用比较多的。

      

       好了,接着说今天的内容了。

       首先从MongoDb的官方网站上下载CSharp驱动()。我使用的是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请求,也就是避免了多个请求带来的开销!

       如果要看更多,请访问我之前的    

      作者: 

      出处:

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

你可能感兴趣的文章
文件防篡改系统ossec搭建
查看>>
JAVA性能调优-I/O优化技巧
查看>>
SharePoint 2013常用开发工具分享
查看>>
DNS反向地址解析配置
查看>>
nginx 图片缓存
查看>>
Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary
查看>>
processing编写简单黑、白圆圈绘图程序
查看>>
Android:Preference、PreferenceActivity、设置列表
查看>>
避开危险网站 Scandoo帮你鉴别
查看>>
JAVA CAS单点登录之四:CAS服务器增加JDBC访问能力
查看>>
虚幻4过场动画编辑器Sequencer脑图
查看>>
网站第三方评论对比
查看>>
【UNREAL ENGINE 游戏开发】开篇之为什么现在就要抱紧UE的大腿!
查看>>
XP共享打印机,win7 64bit如何连接
查看>>
在SQL Server2005中进行错误捕捉
查看>>
踏上《软件设计精要与模式》第二版的征途
查看>>
用C#打造自己的通用数据访问类库(续)
查看>>
拇指接龙游戏中的Undo道具与STL容器deque简介
查看>>
2017年 JavaScript 框架回顾 -- React生态系统
查看>>
CountDownLatch、CyclicBarrier
查看>>