C#/.NET 使用官方驅動操作MongoDB(一):插入、查詢


概述

  想要在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM