在开发之前,选择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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接