设为首页 收藏本站
查看: 1214|回复: 0

[经验分享] MongoDB 驱动实践

[复制链接]

尚未签到

发表于 2015-7-8 08:56:05 | 显示全部楼层 |阅读模式
  作为系列的最后一篇,得要说说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。




DSC0000.gif
1 #region 数据实体
2     ///
3 /// 数据实体
4 ///
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 mongodb;
8
9         #region 初始化操作
10 ///
11 /// 初始化操作
12 ///
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         ///
3 /// 实现linq查询的映射配置
4 ///
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();
18                     mapping.Map();
19                 });
20
21                 config.ConnectionString(connectionString);
22
23                 return config.BuildConfiguration();
24             }
25         }
26         #endregion

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





  1     #region 插入操作
  2         ///
  3 /// 插入操作
  4 ///
  5 ///
  6 ///
  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(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         ///
35 /// 更新操作
36 ///
37 ///
38 ///
39         public void Update(T t, Expression 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(collectionName);
50
51                     collection.Update(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         ///
67 ///获取集合
68 ///
69 ///
70 ///
71         public List List(int pageIndex, int pageSize, Expression 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(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         ///
106 ///读取单条记录
107 ///
108 ///
109 ///
110         public T Single(Expression 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(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         ///
140 /// 删除操作
141 ///
142 ///
143 ///
144         public void Delete(Expression 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(collectionName);
155
156                     //这个地方要注意,一定要加上T参数,否则会当作object类型处理
157 //导致删除失败
158                     collection.Remove(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的索引。
DSC0001.png
  
  6. 一切准备妥当,我们做下基本的操作,比如这里我添加一千条数据,注意我开启的是安全模式,如果插入不成功,将会抛出异常。
   Add:





1    static void Main(string[] args)
2         {
3             MongodbHelper helper = new MongodbHelper();
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         }

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

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





1  static void Main(string[] args)
2         {
3             MongodbHelper helper = new MongodbHelper();
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         }

DSC0003.png
  
  Delete:  删除mary这条记录





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

DSC0004.png
  
list操作: 这里我获取一下名字里面带9的人数列表





1    static void Main(string[] args)
2         {
3             MongodbHelper helper = new MongodbHelper();
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         }

DSC0005.png
  
  总的运行代码








?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253




View Code  

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Configuration;

using System.Linq.Expressions;

   

using MongoDB.Configuration;

using MongoDB.Linq;

using MongoDB.Attributes;

   

   

namespace MongoDB.Test

{

     public class MongodbHelper where T : class

     {

         string connectionString = string.Empty;

   

         string databaseName = string.Empty;

   

         string collectionName = string.Empty;

   

         static MongodbHelper mongodb;

   

         #region 初始化操作

         ///  

/// 初始化操作

///  

         public MongodbHelper()

         {

             connectionString = "Server=127.0.0.1:2222";

             databaseName = "shopex";

             collectionName = "person";

         }

         #endregion

   

         #region 实现linq查询的映射配置

         ///  

/// 实现linq查询的映射配置

///  

         public MongoConfiguration configuration

         {

             get

             {

                 var config = new MongoConfigurationBuilder();

   

                 config.Mapping(mapping =>

                 {

                     mapping.DefaultProfile(profile =>

                     {

                         profile.SubClassesAre(t => t.IsSubclassOf(typeof(T)));

                     });

                     mapping.Map();

                     mapping.Map();

                 });

   

                 config.ConnectionString(connectionString);

   

                 return config.BuildConfiguration();

             }

         }

         #endregion

   

         #region 插入操作

         ///  

/// 插入操作

///  

///  

///  

         public void Insert(T t)

         {

             using (Mongo mongo = new Mongo(configuration))

             {

                 try

                 {

                     mongo.Connect();

   

                     var db = mongo.GetDatabase(databaseName);

   

                     var collection = db.GetCollection(collectionName);

   

                     collection.Insert(t, true);

   

                     mongo.Disconnect();

   

                 }

                 catch (Exception)

                 {

                     mongo.Disconnect();

                     throw;

                 }

             }

         }

         #endregion

   

         #region 更新操作

         ///  

/// 更新操作

///  

///  

///  

         public void Update(T t, Expression func)

         {

             using (Mongo mongo = new Mongo(configuration))

             {

                 try

                 {

                     mongo.Connect();

   

                     var db = mongo.GetDatabase(databaseName);

   

                     var collection = db.GetCollection(collectionName);

   

                     collection.Update(t, func, true);

   

                     mongo.Disconnect();

   

                 }

                 catch (Exception)

                 {

                     mongo.Disconnect();

                     throw;

                 }

             }

         }

         #endregion

   

         #region 获取集合

         ///  

///获取集合

///  

///  

///  

         public List List(int pageIndex, int pageSize, Expression func, out int pageCount)

         {

             pageCount = 0;

   

             using (Mongo mongo = new Mongo(configuration))

             {

                 try

                 {

                     mongo.Connect();

   

                     var db = mongo.GetDatabase(databaseName);

   

                     var collection = db.GetCollection(collectionName);

   

                     pageCount = Convert.ToInt32(collection.Count());

   

                     var personList = collection.Linq().Where(func).Skip(pageSize * (pageIndex - 1))

                                                    .Take(pageSize).Select(i => i).ToList();

   

                     mongo.Disconnect();

   

                     return personList;

   

                 }

                 catch (Exception)

                 {

                     mongo.Disconnect();

                     throw;

                 }

             }

         }

         #endregion

   

         #region 读取单条记录

         ///  

///读取单条记录

///  

///  

///  

         public T Single(Expression func)

         {

             using (Mongo mongo = new Mongo(configuration))

             {

                 try

                 {

                     mongo.Connect();

   

                     var db = mongo.GetDatabase(databaseName);

   

                     var collection = db.GetCollection(collectionName);

   

                     var single = collection.Linq().FirstOrDefault(func);

   

                     mongo.Disconnect();

   

                     return single;

   

                 }

                 catch (Exception)

                 {

                     mongo.Disconnect();

                     throw;

                 }

             }

         }

         #endregion

   

         #region 删除操作

         ///  

/// 删除操作

///  

///  

///  

         public void Delete(Expression func)

         {

             using (Mongo mongo = new Mongo(configuration))

             {

                 try

                 {

                     mongo.Connect();

   

                     var db = mongo.GetDatabase(databaseName);

   

                     var collection = db.GetCollection(collectionName);

   

                     //这个地方要注意,一定要加上T参数,否则会当作object类型处理

//导致删除失败

                     collection.Remove(func);

   

                     mongo.Disconnect();

   

                 }

                 catch (Exception)

                 {

                     mongo.Disconnect();

                     throw;

                 }

             }

         }

         #endregion

     }

   

     #region 数据实体

     ///  

/// 数据实体

///  

     public class Person

     {

         [MongoAlias("_id")]

         public string ID { get; set; }

   

         public string Name { get; set; }

   

         public int Age { get; set; }

   

         public DateTime CreateTime { get; set; }

     }

     #endregion

}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84355-1-1.html 上篇帖子: MongoDB以Windows服务安装(Windows 32-bit) 下篇帖子: mongoDB 在 Windows 下的安装测试(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表