什么是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/如果出現下圖表示服務安裝成功
如果需要卸載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