概述
想要在C#中使用MongoDB,首先得要有個MongoDB支持的C#版的驅動。
C#版的驅動有很多,這里我們先用官方提供的 MongoDB.Driver(使用 Nuget 安裝),當前版本為2.7.0。
NuGet 會同時安裝3個軟件包,其中:
MongoDB.Driver:顧名思義,驅動程序。(它幾乎沒有任何遺留代碼,應該用於所有新項目)
MongoDB.Bson:序列化、Json相關。(它是MongoDB.Driver.Core的依賴。它可以被自己使用)
MongoDB.Driver.Core:驅動程序的核心和MongoDB.Driver的依賴。你可能不會直接使用這個包
另外,在nuget上還有1個軟件包:
MongoDB.Driver.GridFS:GridFS包。更多文檔可以在參考指南中找到。
安裝好驅動后,我們就可以開始擼代碼了。
1.建立數據庫連接
1 // 使用連接字符串連接 2 var client = new MongoClient("mongodb://localhost:27017"); 3 4 // 制定多個地址和端口,讓程序自動選擇一個進行連接。 5 var client = new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019");
該 MongoClient 實例實際上代表了一個到數據庫的連接池; 即使有多個線程,也只需要一個 MongoClient 類的實例。
2.獲取數據庫
我們可以使用client的GetDatabase方法獲取數據庫,即使數據庫不存在,也沒有關系,它會在首次使用數據庫的時候進行自動創建。
var database = client.GetDatabase("foo");
3.獲取數據集 Collection
調用database的GetCollection<TDocument>方法可以獲取數據集,其中如果數據是預先定義好的可以在<輸入數據的類型> ,如果是沒有定義好的,可以使用BsonDocument類型,BsonDocument表示沒有預定於的模式。
var collection = database.GetCollection<BsonDocument>("bar");
此時,我們將獲取到“foo”數據庫中的“bar”集合,即使“bar”集合不存在也沒有關系,同數據庫一樣,若數據集不存在,會自動創建該數據集。
4.插入數據
獲得了collection數據集后,就可以往數據集中插入數據了。
我們可以使用BsonDocument來創建 document 文檔對象。
1 var document = new BsonDocument 2 { 3 { "name", "MongoDB" }, 4 { "type", "Database" }, 5 { "count", 1 }, 6 { "info", new BsonDocument 7 { 8 { "x", 203 }, 9 { "y", 102 } 10 }} 11 };
要將該document插入到collection中,我們可以使用InsertOne(同步插入)或InsertOneAsync(異步插入)方法。
InsertOne(同步插入):
collection.InsertOne(document);
InsertOneAsync(異步插入):
await collection.InsertOneAsync(document);
如果想要插入多個數據,可以使用 InsertMany 或
InsertManyAsync
方法。
5.查詢數據
查詢數據中,分三種進行敘述:
第一種,獲取第一條數據,
第二種,獲取所有數據,
第三種,獲取指定條件下的數據。
5.1查找集合中的第一條數據
查詢集合中的第一條數據,需要用到的是FirstOrDefault方法或者FirstOrDefaultAsync方法,當有數據時,返回數據的第一條或者默認的那條,當沒有數據時,返回null.
同步查詢並打印數據:
1 var document = collection.Find(new BsonDocument()).FirstOrDefault(); 2 Console.WriteLine(document.ToString());
異步查詢並打印數據:
var document = await collection.Find(new BsonDocument()).FirstOrDefaultAsync(); Console.WriteLine(document.ToString());
5.2查詢數數據集中的所有數據
要查找數據集中的所有數據,可以使用ToList或者ToListAsync方法,需要注意的是,這種在預期返回數據較少的時候使用。
同步查詢所有數據:
var documents = collection.Find(new BsonDocument()).ToList();
異步查詢所有數據:
var documents = await collection.Find(new BsonDocument()).ToListAsync();
獲取到了數據后,我們可以使用foreach的方法遍歷得到每一個數據的值。
如果返回的數據預期很大,建議采用以下異步的迭代的方法處理。
await collection.Find(new BsonDocument()).ForEachAsync(d => Console.WriteLine(d));
如果實在要用同步的方法,那么可以使用ToEnumerable適配器方法。
1 var cursor = collection.Find(new BsonDocument()).ToCursor(); 2 foreach (var document in cursor.ToEnumerable()) 3 { 4 Console.WriteLine(document); 5 }
5.3用過濾器篩選獲取單個文檔
可以通過創建一個過濾器來傳遞給Find方法來獲取我們需要的的那個子集,然后用Fist方法,獲取第一條數據。
首先,創建一個篩選器:
var filter = Builders<BsonDocument>.Filter.Eq("i", 71);
以上篩選器表示篩選i=71的數據。
然后,通過同步或者異步的方法來查找符合該條件的數據:
var document = collection.Find(filter).First(); Console.WriteLine(document);
或:
1 var document = await collection.Find(filter).FirstAsync(); 2 Console.WriteLine(document);
因為我們在Find()后調用了Fist方法,所以獲取的只是一條數據,如果不調用該函數,則獲取的是一個數據集合。
5.4使用過濾器獲取一組文檔
如果我們要獲取的是大於或者小於某值的數據集,那么就可以不用Fist()方法了。
比如,獲取i>50的數據,我們先設計一個這樣的篩選器:
var filter = Builders<BsonDocument>.Filter.Gt("i", 50);
然后,查找符合該條件的所有數據並輸出。
同步方法:
1 var cursor = collection.Find(filter).ToCursor(); 2 foreach (var document in cursor.ToEnumerable()) 3 { 4 Console.WriteLine(document); 5 }
異步方法:
await collection.Find(filter).ForEachAsync(document => Console.WriteLine(document));
如果是50<i<=100,我們可以設計一個這樣的篩選器:
1 var filterBuilder = Builders<BsonDocument>.Filter; 2 var filter = filterBuilder.Gt("i", 50) & filterBuilder.Lte("i", 100);
1