服务器之家

服务器之家 > 正文

在.Net中使用MongoDB的方法教程

时间:2020-05-05 15:48     来源/作者:赵大宝

什么是MongoDB

MongoDB是基于文档的存储的(而非表),是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。Mongo主要解决的是海量数据的访问效率问题。因为Mongo主要是支持海量数据存储的,所以Mongo还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储。由于Mongo可以支持复杂的数据结构,而且带有强大的数据查询功能,因此非常受到欢迎。

BSON是MongoDB的数据存储格式。大家对于JSON比较熟悉,但是什么是BSON呢BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。

BSON具有如下特点

1.更快的遍历速度

  对JSON格式来说,太大的JSON结构会导致数据遍历非常慢。在JSON中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦数据结构匹配,比如括号的匹配,而BSON对JSON的一大改进就是,它会将JSON的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。

2.操作更简易

  对JSON来说,数据存储是无类型的,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。当然,在MongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的。

3.增加了额外的数据类型

  JSON是一个很方便的数据交换格式,但是其类型比较有限。BSON在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成JSON。大大减少了计算开销和数据大小。当然,在有的时候,BSON相对JSON来说也并没有空间上的优势,因为有了类型概念。

MongoDB windows下 安装

MongoDB的安装很简单,设置好安装路径后,一直Next直到安装结束,最大的坑就是MongoDB服务的安装,下面具体说下MongoDB安装之后的一些配置操作

1.在根目录下创建数据库路径(data目录)、日志路径(logs目录)、日志文件(mongo.log文件)、配置路径(conf目录)我的安装路径是:D:\Program Files\mongodb

2.在conf目录下创建配置文件mongo.conf,文件内容如下:

?
1
2
3
4
5
6
7
8
9
10
11
logpath=D:\Program Files\mongodb\logs\mongodb.log #日志输出文件路径
 
logappend=true #错误日志采用追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是从新创建一个新文件
 
journal=true #启用日志文件,默认启用
 
quiet=true #这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
 
port=27017 #端口号 默认为27017
 
auth=true #启用验证 需要用户名密码

配置完成以上2个步骤 就可以 启动MongoDB了

运行CMD 输入命令 (注意 mongod的路径)

?
1
mongod --config " D:\Program Files\mongodb\data \conf\mongo.conf"

3.创建并启动MongoDB服务

如果每次都按照步骤三那样操作,岂不是相当麻烦,按照如下命令来创建并启动MongoDB服务,就可以通过windows服务来管理MongoDB的启动和关闭了

?
1
2
3
mongod --config " D:\Program Files\mongodb\data \conf\mongo.conf" --install --serviceName "MongoDB"
 
net start MongoDB

测试是否成功 可以在 浏览器中输入http://localhost:27017/如果出现下图表示服务安装成功

在.Net中使用MongoDB的方法教程

如果需要卸载MongoDB服务 在CMD 中运行

?
1
mongod.exe --remove --serviceName "MongoDB"

前期准备工作完成了,就可以开始撸代码了

如何在.net 中使用MongoDB

首先在项目中引入 MongoDB.Bson.dll,MongoDB.Driver.dll,MongoDB.Driver.Core.dll 我使用的是2.0版本的 现在好多文章都是介绍使用1+版本的 这也是我写此文的目的引入驱动DLL后,就可以开始撸代码了

部分代码如下

?
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
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
private static MongoClient client;
 
private static IMongoDatabase database;
 
//本地配置
 
private const string MongoDBConnectionStr = "mongodb://localhost";
 
//数据库名称
 
private static string DefaultDataBaseName = "Test";
 
 
 
 
 
public MongoDBHelper()
 
{
 
 GetConnection(DefaultDataBaseName);
 
}
 
 
 
/// <summary>
 
/// 构造函数 指定数据库
 
/// </summary>
 
/// <param name="dataBaseName"></param>
 
public MongoDBHelper(string dataBaseName)
 
{
 
 GetConnection(dataBaseName);
 
}
 
 
 
private static void GetConnection(string dataBaseName)
 
{
 
 client = new MongoClient(MongoDBConnectionStr);
 
 database = client.GetDatabase(dataBaseName);
 
}
 
 
 
/// <summary>
 
/// 异步插入一条数据,手动输入collection name
 
/// </summary>
 
public Task InsertAsync<T>(string collectionName, T obj)
 
{
 
 if (database == null)
 
 {
 
  throw new Exception("没有指定数据库");
 
 }
 
 var collection = database.GetCollection<T>(collectionName);
 
 return collection.InsertOneAsync(obj);
 
}
 
 
 
/// <summary>
 
/// 异步插入一条数据,采用类型T的完全限定名作为collection name
 
/// </summary>
 
public Task InsertAsync<T>(T obj)
 
{
 
 return InsertAsync(typeof(T).FullName, obj);
 
}
 
 
 
/// <summary>
 
/// 异步插入多条数据,手动输入collection name
 
/// </summary>
 
public Task BatchInsertAsync<T>(string collectionName, IEnumerable<T> objs)
 
{
 
 if (database == null)
 
 {
 
  throw new Exception("没有指定数据库");
 
 }
 
 if (objs == null)
 
 {
 
  throw new ArgumentException();
 
 }
 
 var collection = database.GetCollection<T>(collectionName);
 
 return collection.InsertManyAsync(objs);
 
}
 
 
 
/// <summary>
 
/// 异步插入多条数据,采用类型T的完全限定名作为collection name
 
/// </summary>
 
public Task BatchInsertAsync<T>(IEnumerable<T> objs)
 
{
 
 return BatchInsertAsync(typeof(T).FullName, objs);
 
}
 
 
 
/// <summary>
 
/// 插入一条数据
 
/// </summary>
 
public void Insert<T>(T obj)
 
{
 
 InsertAsync(obj).Wait();
 
}
 
 
 
/// <summary>
 
/// 插入多条数据
 
/// </summary>
 
public void Insert<T>(IEnumerable<T> objs)
 
{
 
 BatchInsertAsync(objs).Wait();
 
}
 
 
 
/// <summary>
 
/// MongoDB C# Driver的Find方法,返回IFindFluent。手动输入collection name
 
/// </summary>
 
public IFindFluent<T, T> Find<T>(string collectionName, FilterDefinition<T> filter, FindOptions options = null)
 
{
 
 if (database == null)
 
 {
 
  throw new Exception("没有指定数据库");
 
 }
 
 var collection = database.GetCollection<T>(collectionName);
 
 return collection.Find(filter, options);
 
}
 
 
 
/// <summary>
 
/// MongoDB C# Driver的Find方法,返回IFindFluent。采用类型T的完全限定名作为collection name
 
/// </summary>
 
public IFindFluent<T, T> Find<T>(FilterDefinition<T> filter, FindOptions options = null)
 
{
 
 return Find(typeof(T).FullName, filter, options);
 
}
 
 
 
/// <summary>
 
/// 取符合条件的数据 sort中多个排序条件逗号分隔,默认asc
 
/// </summary>
 
public List<T> Get<T>(Expression<Func<T, bool>> condition, int skip, int limit, string sort)
 
{
 
 return Get(new List<Expression<Func<T, bool>>> { condition }, skip, limit, sort);
 
}
 
 
 
public List<T> Get<T>(Expression<Func<T, bool>> condition)
 
{
 
 return Get(condition, 0, 0, null);
 
}
 
 
 
/// <summary>
 
/// 取符合条件的数据 sort中多个排序条件逗号分隔,默认asc
 
/// </summary>
 
public List<T> Get<T>(List<Expression<Func<T, bool>>> conditions, int skip, int limit, string sort)
 
{
 
 if (conditions == null || conditions.Count == 0)
 
 {
 
  conditions = new List<Expression<Func<T, bool>>> { x => true };
 
 }
 
 var builder = Builders<T>.Filter;
 
 var filter = builder.And(conditions.Select(x => builder.Where(x)));
 
 
 
 var ret = new List<T>();
 
 try
 
 {
 
  List<SortDefinition<T>> sortDefList = new List<SortDefinition<T>>();
 
  if (sort != null)
 
  {
 
   var sortList = sort.Split(',');
 
   for (var i = 0; i < sortList.Length; i++)
 
   {
 
    var sl = Regex.Replace(sortList[i].Trim(), @"\s+", " ").Split(' ');
 
    if (sl.Length == 1 || (sl.Length >= 2 && sl[1].ToLower() == "asc"))
 
    {
 
     sortDefList.Add(Builders<T>.Sort.Ascending(sl[0]));
 
    }
 
    else if (sl.Length >= 2 && sl[1].ToLower() == "desc")
 
    {
 
     sortDefList.Add(Builders<T>.Sort.Descending(sl[0]));
 
    }
 
   }
 
  }
 
  var sortDef = Builders<T>.Sort.Combine(sortDefList);
 
  ret = Find(filter).Sort(sortDef).Skip(skip).Limit(limit).ToListAsync().Result;
 
 }
 
 catch (Exception e)
 
 {
 
  //异常处理
 
 }
 
 return ret;
 
}
 
 
 
public List<T> Get<T>(List<Expression<Func<T, bool>>> conditions)
 
{
 
 return Get(conditions, 0, 0, null);
 
}

示例代码中只实现了插入和查询功能,后续会将完整代码上传

总结

本文只记录了MongoDB的最基本使用,后续会介绍副本级,主从自动备份等机制与实现方式,感兴趣的朋友们请继续关注服务器之家,谢谢大家对服务器之家的支持。

原文链接:http://www.cnblogs.com/zhaodayou/p/6875586.html

标签:

相关文章

热门资讯

沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
返回顶部