转载: 8天学通MongoDB——第八天 驱动实践

  作为系列的最后一篇,得要说说C#驱动对MongoDB的操作,目前驱动有两种:官方驱动和samus驱动,不过我个人还是喜欢后者,

因为提供了丰富的linq操作,相当方便。

 

官方驱动:https://github.com/mongodb/mongo-csharp-driver/downloads。下载后,还提供了一个酷似msdn的帮助文档。

samus驱动:https://github.com/samus/mongodb-csharp/downloads。 

 

下面就具体看看samus驱动,https://github.com/samus/mongodb-csharp/blob/master/examples/Simple/Main.cs上面提供了

一个简单的demo,大体上看看我们就知道怎么玩了。

 

一: 实践

1:我们建立一个Person实体,MongoAlias特性表示取别名,这里的ID值将会覆盖掉数据库自动生成的_id。

复制代码
 1 #region 数据实体
2 /// <summary>
3 /// 数据实体
4 /// </summary>
5 public class Person
6 {
7 [MongoAlias("_id")]
8 public string ID { get; set; }
9
10 public string Name { get; set; }
11
12 public int Age { get; set; }
13
14 public DateTime CreateTime { get; set; }
15 }
16 #endregion
复制代码


2:初始化一些变量

复制代码
 1         string connectionString = string.Empty;
2
3 string databaseName = string.Empty;
4
5 string collectionName = string.Empty;
6
7 static MongodbHelper<T> mongodb;
8
9 #region 初始化操作
10 /// <summary>
11 /// 初始化操作
12 /// </summary>
13 public MongodbHelper()
14 {
15 connectionString = "Server=127.0.0.1:2222";
16 databaseName = "shopex";
17 collectionName = "person";
18 }
19 #endregion
复制代码

 

3:为了方便T的继承类使用linq功能,我们还需要映射一下。

复制代码
 1 #region 实现linq查询的映射配置
2 /// <summary>
3 /// 实现linq查询的映射配置
4 /// </summary>
5 public MongoConfiguration configuration
6 {
7 get
8 {
9 var config = new MongoConfigurationBuilder();
10
11 config.Mapping(mapping =>
12 {
13 mapping.DefaultProfile(profile =>
14 {
15 profile.SubClassesAre(t => t.IsSubclassOf(typeof(T)));
16 });
17 mapping.Map<T>();
18 mapping.Map<T>();
19 });
20
21 config.ConnectionString(connectionString);
22
23 return config.BuildConfiguration();
24 }
25 }
26 #endregion
复制代码

 

4:下面是一些基本的CURD的代码,跟写EF代码很类似,写起来好舒服。

复制代码
  1     #region 插入操作
2 /// <summary>
3 /// 插入操作
4 /// </summary>
5 /// <param name="person"></param>
6 /// <returns></returns>
7 public void Insert(T t)
8 {
9 using (Mongo mongo = new Mongo(configuration))
10 {
11 try
12 {
13 mongo.Connect();
14
15 var db = mongo.GetDatabase(databaseName);
16
17 var collection = db.GetCollection<T>(collectionName);
18
19 collection.Insert(t, true);
20
21 mongo.Disconnect();
22
23 }
24 catch (Exception)
25 {
26 mongo.Disconnect();
27 throw;
28 }
29 }
30 }
31 #endregion
32
33 #region 更新操作
34 /// <summary>
35 /// 更新操作
36 /// </summary>
37 /// <param name="person"></param>
38 /// <returns></returns>
39 public void Update(T t, Expression<Func<T, bool>> func)
40 {
41 using (Mongo mongo = new Mongo(configuration))
42 {
43 try
44 {
45 mongo.Connect();
46
47 var db = mongo.GetDatabase(databaseName);
48
49 var collection = db.GetCollection<T>(collectionName);
50
51 collection.Update<T>(t, func, true);
52
53 mongo.Disconnect();
54
55 }
56 catch (Exception)
57 {
58 mongo.Disconnect();
59 throw;
60 }
61 }
62 }
63 #endregion
64
65 #region 获取集合
66 /// <summary>
67 ///获取集合
68 /// </summary>
69 /// <param name="person"></param>
70 /// <returns></returns>
71 public List<T> List(int pageIndex, int pageSize, Expression<Func<T, bool>> func, out int pageCount)
72 {
73 pageCount = 0;
74
75 using (Mongo mongo = new Mongo(configuration))
76 {
77 try
78 {
79 mongo.Connect();
80
81 var db = mongo.GetDatabase(databaseName);
82
83 var collection = db.GetCollection<T>(collectionName);
84
85 pageCount = Convert.ToInt32(collection.Count());
86
87 var personList = collection.Linq().Where(func).Skip(pageSize * (pageIndex - 1))
88 .Take(pageSize).Select(i => i).ToList();
89
90 mongo.Disconnect();
91
92 return personList;
93
94 }
95 catch (Exception)
96 {
97 mongo.Disconnect();
98 throw;
99 }
100 }
101 }
102 #endregion
103
104 #region 读取单条记录
105 /// <summary>
106 ///读取单条记录
107 /// </summary>
108 /// <param name="person"></param>
109 /// <returns></returns>
110 public T Single(Expression<Func<T, bool>> func)
111 {
112 using (Mongo mongo = new Mongo(configuration))
113 {
114 try
115 {
116 mongo.Connect();
117
118 var db = mongo.GetDatabase(databaseName);
119
120 var collection = db.GetCollection<T>(collectionName);
121
122 var single = collection.Linq().FirstOrDefault(func);
123
124 mongo.Disconnect();
125
126 return single;
127
128 }
129 catch (Exception)
130 {
131 mongo.Disconnect();
132 throw;
133 }
134 }
135 }
136 #endregion
137
138 #region 删除操作
139 /// <summary>
140 /// 删除操作
141 /// </summary>
142 /// <param name="person"></param>
143 /// <returns></returns>
144 public void Delete(Expression<Func<T, bool>> func)
145 {
146 using (Mongo mongo = new Mongo(configuration))
147 {
148 try
149 {
150 mongo.Connect();
151
152 var db = mongo.GetDatabase(databaseName);
153
154 var collection = db.GetCollection<T>(collectionName);
155
156 //这个地方要注意,一定要加上T参数,否则会当作object类型处理
157 //导致删除失败
158 collection.Remove<T>(func);
159
160 mongo.Disconnect();
161
162 }
163 catch (Exception)
164 {
165 mongo.Disconnect();
166 throw;
167 }
168 }
169 }
170 #endregion
复制代码



5.   好,我们开一下2222端口,由于前前篇我已经把这个mongodb做成了服务,现在就直接连过去了,并做一下对Name的索引。

 

6. 一切准备妥当,我们做下基本的操作,比如这里我添加一千条数据,注意我开启的是安全模式,如果插入不成功,将会抛出异常。

 <1> Add:

复制代码
 1    static void Main(string[] args)
2 {
3 MongodbHelper<Person> helper = new MongodbHelper<Person>();
4
5 //插入1000条数据
6 for (int i = 0; i < 1000; i++)
7 {
8 helper.Insert(new Person()
9 {
10 ID = Guid.NewGuid().ToString(),
11 Name = "jack" + i,
12 Age = i,
13 CreateTime = DateTime.Now
14 });
15 }
16
17 Console.WriteLine("插入成功");
18
19 Console.Read();
20 }
复制代码

乍一看显示的数据以为有问题,为什么没有出现jack0或者jack999,不过find的一下后心情舒坦了。

<2> update:   这里就把jack941的名字改掉“mary”

复制代码
 1  static void Main(string[] args)
2 {
3 MongodbHelper<Person> helper = new MongodbHelper<Person>();
4
5 //修改jack941改成mary
6 var single = helper.Single(i => i.Name == "jack941");
7 single.Name = "mary";
8 helper.Update(single, i => i.ID == single.ID);
9
10 Console.WriteLine("修改成功");
11 Console.Read();
12 }
复制代码

 

<3>Delete:  删除mary这条记录

复制代码
 1      static void Main(string[] args)
2 {
3 MongodbHelper<Person> helper = new MongodbHelper<Person>();
4
5 //删除mary这个记录
6 helper.Delete(i => i.Name == "mary");
7
8 Console.WriteLine("删除成功");
9 Console.Read();
10 }
复制代码


<4> list操作: 这里我获取一下名字里面带9的人数列表

复制代码
 1    static void Main(string[] args)
2 {
3 MongodbHelper<Person> helper = new MongodbHelper<Person>();
4
5 int pagecount;
6
7 //获取名字里面带9的人数
8 var list = helper.List(1, 20, i => i.Name.Contains("9"), out pagecount);
9
10 Console.Read();
11 }
复制代码

 

总的运行代码

View Code

 

 

wow,趁着3天的休假,不断的努力终于把这个系列写完了,很感谢一直关注此系列的朋友。

 
分类: MongoDB
 
好文要顶 关注我 收藏该文  
66
1
 
关注我
 
« 上一篇:8天学通MongoDB——第七天 运维技术
» 下一篇:5天不再惧怕多线程——第一天 尝试Thread
posted @ 2012-03-09 00:51 一线码农 阅读(37745) 评论(47编辑 收藏
 

 
  
#1楼2012-03-09 08:53 唐小熊  
就等着你写完,整个系列一起研究
  
#2楼2012-03-09 09:06 codesnippet.info  
官方驱动正在努力完成LINQ。。。。。
不用多久应该就能搞定了
  
#3楼2012-03-09 09:47 永不言败  
官方驱动也有linq了吧
  
#4楼[楼主2012-03-09 10:57 一线码农  
@ ITBear
哈哈,能在这里吸取点水分是我最大的快乐。
  
#5楼[楼主2012-03-09 10:58 一线码农  
@ magicDict
呵呵,谢谢你的提醒。
  
#6楼[楼主2012-03-09 10:59 一线码农  
@ 永不言败
谁好用就用谁呗...
  
#7楼2012-03-09 11:55 不若相忘于江湖  
不太喜欢用LINQ。 并且samus的驱动好像在并行时,总会出问题,而官方的驱动就不用, 并且从维护性和可靠性来讲,官方的更好些吧, 其实不用LINQ也很好查询,学点MONGO语法就好。
  
#8楼[楼主2012-03-09 12:00 一线码农  
@ 不若相忘于江湖
谢谢提醒,正在实践中...
  
#9楼2012-03-20 18:06 lhfly  
好 很好
  
#10楼2012-03-22 23:10 lhfly  
有个错啊,帮忙看看。
/// <summary>
/// Initializes a new instance of the <see cref="MongoAliasAttribute"/> class.
/// </summary>
/// <param name="name">The name.</param>
public MongoAliasAttribute(string name){
if(name == null)
throw new ArgumentNullException("name");
if (name == "_id")
throw new ArgumentException("_id is a reserved alias.");

Name = name;
}
  
#11楼2012-03-22 23:11 lhfly  
throw new ArgumentException("_id is a reserved alias.");

出这个异常
  
#12楼2012-03-22 23:14 lhfly  

作一个简单的数据插入+分页(每5条分页)
  
#19楼2012-03-24 17:48 lhfly  
  
#21楼2012-03-24 17:51 lhfly  
当我插入《王九》的时候,《王九》被分到第二页了。
再次插入数据,一直增加在第二页,
第二页满了,就往第三页增加。

我用的是GridView绑定数据,在绑定List集合的时候,已经排序了,每次插入数据之后,我都重新绑定了。
  
#22楼2012-03-24 17:52 lhfly  
我想要的效果就是,最后插入的数据在第一页显示(因为我按创建时间降序了)
  
#23楼2012-03-24 17:57 lhfly  
最奇怪的是,我把VS关了,重新打开项目,它的排序方式还是这样
<img src="http://pic002.cnblogs.com/images/2012/256746/2012032417550822.jpg" alt="" border="0" "="" style="margin: 0px; padding: 0px; border: 0px; max-width: 400px;">
唯一能改变分页的就是,把分页大小重新设置(不要为5)就可以
  
#24楼2012-03-28 21:11 East神奇  
谢谢楼主分享!
  
#25楼2012-05-07 17:05 放逐忧伤  
看了楼主的8篇文章写得很好 而且很多图片 
不知道楼主在mongodb安全方面有没有用到ssh ,最近在弄这个 不知道怎么配置SSH 郁闷死了
  
#26楼2013-04-03 22:36 老班长  
谢谢楼主的讲解和分享,收获多多!!!
  
#27楼2013-06-18 14:32 helion  
哈哈 一口气看完了,非常感谢这么细致的讲解
  
#28楼2013-06-22 22:13 游客  
这个系列真的很精彩,感谢楼主的分享。
另:public List<T> List(args)
这个地方的pagecount是不是不准确,
这样取的是整个集合的总数,而不是符合func中的记录总数,
所以作为分页的依据会不准确,请解惑!
  
#29楼2013-09-03 15:28 绝杀fc小飞侠  
只能用c# ???
  
#30楼2013-09-03 16:03 绝杀fc小飞侠  
每次都用cmd,没有编辑mongodb的编辑工具?
  
#31楼2013-09-12 12:53 JerremyZhang  
@ 绝杀fc小飞侠
很多语言都可以,可以去官网看下各个语言驱动
  
#32楼2013-09-12 12:54 JerremyZhang  
@ 绝杀fc小飞侠
MongoVue
  
#33楼2013-10-18 11:03 chang290  
非常感谢,楼主,就是看着您的这系列入门的。
  
#34楼2013-11-14 15:57 yansy115  
楼主大神,
拜读了你的大作,我在用mongodb的时候发现,数据显示有缓存,每次要刷新两次才能得到我要的正确错误,
另外,不知道distinct怎么加分页,请楼主不吝赐教
谢谢
  
#35楼2013-11-25 23:07 lvwenwen  
楼主写的不错,麻烦楼主上传可以跑的工程,谢谢
  
#36楼2014-04-12 11:13 熊猫妞妞抽烟不  
感谢楼主,该系列已学,对mongo有了点了解!
  
#37楼2014-06-25 09:49 Yellows  
非常好,就是大数据量的时候用 SKIP分页基本就是 通讯失败!
  
#38楼2014-08-13 12:39 微温的便当  
请教楼主以及各位猿友:给数据库设置了用户验证后, 怎么在代码中配置用户信息来登录数据库?
  
#39楼2014-08-13 16:49 nickycookie  
config.Mapping(mapping =>
{
mapping.DefaultProfile(profile =>
{
profile.SubClassesAre(t => t.IsSubclassOf(typeof(T)));
});
mapping.Map<T>();
mapping.Map<T>();
});
这段能解释下意思吗?
  
#40楼2014-12-14 17:16 有个慵懒  
不好意思,我是边学边在项目中开始用MongoDb的,你例子中的Mongo类是怎么来的?
  
#41楼2015-01-26 13:49 田超saltlight  
谢谢楼主的总结与分享!
  
#42楼2015-02-03 17:56 理查德大叔  
@ 绝杀fc小飞侠
MongoVUE绝对的大杀器
  
#43楼2015-07-13 14:24 咸鱼翻身  
非常感谢。从0到1了。为了大家使用方便,我把cmd输入的在形成了文字,供其他爱好者参考。从下往上看:-)
-------------------------------------------------------------------------
db.loc.insert(
{
"_id":1,
"name":"天安门",
"location":
[116.12345,39.54321]})

db.loc.insert(
{
"_id":2,
"name":"清河",
"location":
[126.12345,69.54321]})

db.loc.insert(
{
"_id":3,
"name":"昌平",
"location":
[176.12345,99.54321]})

db.loc.insert(
{
"_id":4,
"name":"回龙观",
"location":
[16.12345,39.54321]})

db.loc.ensureIndex(
{
"location":"2d"
})

db.loc.find()

db.loc.find(
{
location:{
$near:[50,50],
$maxDisctance:5
}
}).limit(20)

db.loc.find(
{
location:{
$near:[1,1],
$maxDisctance:2111
}
}).limit(10)

// 定义一个矩形区域 
var box = [ 
// 左上角 
[10.73083, 73.988135], 
// 右下角 
[140.741404, 13.99756] 
]; 

// 查找 
db.loc.find({ 
"location" : { 
"$within" : { 
"$box" : box


}); 

// 定义中心点 
var center = [1, 1]; 
// 定义查找半径 
var radius = 180; 

// 查找 
db.loc.find({ 
"location" : { 
"$within" : { 
// 注意这里是数组传递 
"$center" : [ 
center, 
radius 



});
-------------------------------------------------------------------------
db.people.find({"name":"joker-39-12"})

db.people.find({"name":"joker-39-12"}).explain()

joker-39-12
-------------------------------------------------------------------------
for(var i=0;i<10000;i++)
{
var rand = parseInt(i*Math.random());
db.people.insert({"name":"joker-" + i + "-" + rand,"age":rand});
}

for(var i=0;i<10000;i++){ var rand = parseInt(i*Math.random()); db.people.insert({"name":"joker-" + i + "-" + rand,"age":rand});}

db.people.find()

db.people.find().count()
-------------------------------------------------------------------------
db.user.find({"address.province":"anhui"})

-------------------------------------------------------------------------
var single={"name":"jack","person":"123456","age":20,"address":{"province":"anhui","city":"hefei"},"favourite":["apple","banana"]}

db.user.insert(single)

single.name="joe"

single.age=25

single.address={"province":"jiangsu","city":"nanjing"}

single.favourite=["MM","美元"]

db.user.insert(single)

db.user.find();
-------------------------------------------------------------------------
db.person.insert({"name":"jack","age":20})
db.person.insert({"name":"joe","age":25})

db.person.find()
db.person.find({"name":"joe"})

db.person.update({"name":"joe"},{"name":"joeee","age":10})

-------------------------------------------------------------------------
D:\Program Files\MongoDB\Server\3.0

d:

cd bin

mongo

show dbs
-------------------------------------------------------------------------
  
#44楼2015-09-21 11:41 咸鱼翻身  
你好 
mapping.Map<T>();
mapping.Map<T>();

为什么要写两行的,谢谢!
  
#45楼2015-10-13 13:27 Sumyfly  
顶楼主,感谢楼主的无私奉献!
  
#46楼2015-12-28 11:39 jerryli_vip  
谢谢博主,辛苦了!
  
#47楼2016-01-15 11:28 紫系流月  
我去一天看完了0.0
posted @ 2017-06-23 12:20  o李一波o  阅读(133)  评论(0编辑  收藏  举报