先貼官方文檔地址:http://mongodb.github.io/mongo-csharp-driver/
安裝部分很簡單,nuget搜索並安裝 MongoDB.Driver
MongoDB Driver快速瀏覽
這是MongoDB驅動程序快速瀏覽的第一部分。在這一部分中,我們將看看如何執行基本的CRUD(創建,讀取,更新,刪除)操作。在接下來的部分,我們將看看執行一些管理功能。
建立連接
以下示例顯示了連接到本地計算機上的一個或多個服務器的三種方法。
// To directly connect to a single MongoDB server // (this will not auto-discover the primary even if it's a member of a replica set) var client = new MongoClient(); // or use a connection string var client = new MongoClient("mongodb://localhost:27017"); // or, to connect to a replica set, with auto-discovery of the primary, supply a seed list of members var client = new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019");
該client實例現在擁有一個到連接字符串中指定的服務器或服務器的連接池。
MongoClient
該MongoClient實例實際上代表了一個到數據庫的連接池; 即使有多個線程,您也只需要MongoClient類的一個實例。
重要
通常,您只能MongoClient為給定群集創建一個實例,並在整個應用程序中使用它。MongoClients但是,只有在連接字符串相同的情況下,創建多個意志仍將共享相同的連接池。
獲取數據庫
要獲取數據庫,請在上面的GetDatabase方法中指定數據庫的名稱client。如果數據庫尚不存在,那也沒問題。它將在第一次使用時創建。
var database = client.GetDatabase("foo");
該database變量現在擁有對“foo”數據庫的引用。
獲取收藏
要獲取集合以進行操作,請將集合的名稱指定給該GetCollection<TDocument>方法database。如果該集合尚不存在,那也沒關系。它將在第一次使用時創建。
var collection = database.GetCollection<BsonDocument>("bar");
該collection變量現在擁有對“foo”數據庫中“bar”集合的引用。
注意
泛型參數TDocument表示集合中存在的模式。上面,我們用a BsonDocument來表示我們沒有預定義的模式。也可以使用普通的C#對象(POCO)。有關更多信息,請參閱映射文檔。
插入文件
一旦擁有collection實例,就可以將文檔插入到集合中。例如,請考慮以下JSON文檔; 該文檔包含一個嵌入式文檔的字段信息:
{ "name": "MongoDB", "type": "database", "count": 1, "info": { x: 203, y: 102 } }
要使用.NET驅動程序創建文檔,請使用BsonDocument該類。您也可以使用此類創建嵌入文檔。
var document = new BsonDocument { { "name", "MongoDB" }, { "type", "Database" }, { "count", 1 }, { "info", new BsonDocument { { "x", 203 }, { "y", 102 } }} };
要將文檔插入到集合中,請使用InsertOne 或者 InsertOneAsync方法。
collection.InsertOne(document); await collection.InsertOneAsync(document);
插入多個文檔
要插入多個文檔,可以使用InsertManyor InsertManyAsync方法。
// generate 100 documents with a counter ranging from 0 - 99 var documents = Enumerable.Range(0, 100).Select(i => new BsonDocument("counter", i)); collection.InsertMany(documents); await collection.InsertManyAsync(documents);
計數文件
現在我們已經插入了101個文檔(我們在循環中加入了100個,加上第一個文檔),我們可以檢查是否全部使用Countor CountAsync方法。以下代碼應該將count的值設置為101。
var count = collection.Count(new BsonDocument()); var count = await collection.CountAsync(new BsonDocument());
注意
該方法的空BsonDocument參數CountAsync是一個過濾器。在這種情況下,它是一個空過濾器,指示對所有文檔進行計數。
查詢集合
使用該Find方法查詢集合。該Find方法返回一個IFindFluent<TDocument, TProjection>實例,為鏈接查找操作選項提供流暢的接口。
查找集合中的第一個文檔
要獲取集合中的第一個文檔,請調用FirstOrDefaultor FirstOrDefaultAsync方法。FirstOrDefault返回第一個文檔或null。這對僅適用於單個文檔的查詢或僅對第一個文檔感興趣的查詢很有用。
以下示例打印集合中找到的第一個文檔。
var document = collection.Find(new BsonDocument()).FirstOrDefault(); Console.WriteLine(document.ToString()); var document = await collection.Find(new BsonDocument()).FirstOrDefaultAsync(); Console.WriteLine(document.ToString());
該示例應打印以下文檔:
{ "_id": ObjectId("551582c558c7b4fbacf16735") }, "name": "MongoDB", "type": "database", "count": 1, "info": { "x" : 203, "y" : 102 } }
注意
“ id”元素已被MongoDB自動添加到您的文檔中,您的值將與所示值不同。MongoDB保留以“ ”和“$” 開頭的字段名稱供內部使用。
查找集合中的所有文檔
要檢索集合中的所有文檔,請調用ToListor ToListAsync方法。這在預計要返回的文檔數量很小時很有用。
var documents = collection.Find(new BsonDocument()).ToList(); var documents = await collection.Find(new BsonDocument()).ToListAsync();
如果文檔數量預計很大或者可以迭代處理,那么ForEachAsync將為每個返回的文檔調用回調。
await collection.Find(new BsonDocument()).ForEachAsync(d => Console.WriteLine(d));
要使用同步API遍歷返回的文檔,請使用帶ToEnumerable適配器方法的C#foreach語句:
var cursor = collection.Find(new BsonDocument()).ToCursor(); foreach (var document in cursor.ToEnumerable()) { Console.WriteLine(document); }
上面的每個例子都會向控制台輸出完全相同的東西。有關迭代的更多信息,請參閱參考文檔。
使用過濾器獲取單個文檔
我們可以創建一個過濾器來傳遞給Find方法,以獲取我們的集合中的文檔的子集。例如,如果我們想要查找“i”字段的值為71的文檔,我們將執行以下操作:
var filter = Builders<BsonDocument>.Filter.Eq("i", 71); var document = collection.Find(filter).First(); Console.WriteLine(document); var document = await collection.Find(filter).FirstAsync(); Console.WriteLine(document); 它應該只打印一個文件: { "_id" : ObjectId("5515836e58c7b4fbc756320b"), "i" : 71 }
使用過濾器獲取一組文檔
我們還可以從我們的收藏中獲得一組文檔。例如,如果我們想要獲取所有文檔i > 50,我們可以這樣寫:
var filter = Builders<BsonDocument>.Filter.Gt("i", 50); var cursor = collection.Find(filter).ToCursor(); foreach (var document in cursor.ToEnumerable()) { Console.WriteLine(document); } await collection.Find(filter).ForEachAsync(document => Console.WriteLine(document));
我們也可以得到一個范圍,說50 < i <= 100:
var filterBuilder = Builders<BsonDocument>.Filter; var filter = filterBuilder.Gt("i", 50) & filterBuilder.Lte("i", 100); var cursor = collection.Find(filter).ToCursor(); foreach (var document in cursor.ToEnumerable()) { Console.WriteLine(document); } await collection.Find(filter).ForEachAsync(document => Console.WriteLine(document));
排序文件
我們通過調用Sort方法為查詢查詢添加一個排序。下面我們使用Exists過濾器構建器方法和Descending排序構建器方法對我們的文檔進行排序:
var filter = Builders<BsonDocument>.Filter.Exists("i"); var sort = Builders<BsonDocument>.Sort.Descending("i"); var document = collection.Find(filter).Sort(sort).First(); var document = await collection.Find(filter).Sort(sort).FirstAsync();
投影領域
很多時候,我們不需要文檔中包含的所有數據。“ 投影”構建器將幫助為查找操作構建投影參數。下面我們將排除“_id”字段並輸出第一個匹配文檔:
var projection = Builders<BsonDocument>.Projection.Exclude("_id"); var document = collection.Find(new BsonDocument()).Project(projection).First(); Console.WriteLine(document.ToString()); var document = await collection.Find(new BsonDocument()).Project(projection).FirstAsync(); Console.WriteLine(document.ToString());
更新文件
MongoDB支持許多更新運算符。
要最多更新1個文檔(如果沒有匹配過濾器,則可能為0),請使用UpdateOneor UpdateOneAsync方法指定過濾器和更新文檔。在這里,我們更新符合過濾器的第一個文檔i == 10並將值設置i為110:
var filter = Builders<BsonDocument>.Filter.Eq("i", 10); var update = Builders<BsonDocument>.Update.Set("i", 110); collection.UpdateOne(filter, update); await collection.UpdateOneAsync(filter, update);
要更新與過濾器匹配的所有文檔,請使用UpdateMany或UpdateManyAsync方法。在這里,我們增加的價值i由100地方i < 100。
var filter = Builders<BsonDocument>.Filter.Lt("i", 100); var update = Builders<BsonDocument>.Update.Inc("i", 100); var result = collection.UpdateOne(filter, update); if (result.IsModifiedCountAvailable) { Console.WriteLine(result.ModifiedCount); } var result = await collection.UpdateManyAsync(filter, update); if (result.IsModifiedCountAvailable) { Console.WriteLine(result.ModifiedCount); }
更新方法返回一個UpdateResult提供有關操作的信息,包括更新修改的文檔數量。
注意
根據服務器的版本,某些功能可能不可用。在這些情況下,我們試圖表現出檢查其可用性的能力。
刪除文件
要刪除最多1個文檔(如果沒有匹配過濾器,則可以為0)使用DeleteOne或DeleteOneAsync方法:
var filter = Builders<BsonDocument>.Filter.Eq("i", 110); collection.DeleteOne(filter); await collection.DeleteOneAsync(filter);
要刪除與過濾器匹配的所有文檔,請使用DeleteMany或DeleteManyAsync方法。這里我們刪除所有文件,其中i >= 100:
var filter = Builders<BsonDocument>.Filter.Gte("i", 100); var result = collection.DeleteMany(filter); Console.WriteLine(result.DeletedCount); var result = await collection.DeleteManyAsync(filter); Console.WriteLine(result.DeletedCount);
刪除方法返回一個DeleteResult提供有關操作的信息,包括刪除的文檔數量。
批量寫入
有兩種類型的批量操作:
-
有序批量操作。
按順序執行所有操作,並在第一個錯誤中執行錯誤。
-
無序批量操作。
執行所有操作並報告任何錯誤。無序批量操作不保證執行順序。
讓我們看看使用有序和無序操作的兩個簡單例子:
var models = new WriteModel<BsonDocument>[] { new InsertOneModel<BsonDocument>(new BsonDocument("_id", 4)), new InsertOneModel<BsonDocument>(new BsonDocument("_id", 5)), new InsertOneModel<BsonDocument>(new BsonDocument("_id", 6)), new UpdateOneModel<BsonDocument>( new BsonDocument("_id", 1), new BsonDocument("$set", new BsonDocument("x", 2))), new DeleteOneModel<BsonDocument>(new BsonDocument("_id", 3)), new ReplaceOneModel<BsonDocument>( new BsonDocument("_id", 3), new BsonDocument("_id", 3).Add("x", 4)) }; // 1. Ordered bulk operation - order of operation is guaranteed collection.BulkWrite(models); // 2. Unordered bulk operation - no guarantee of order of operation collection.BulkWrite(models, new BulkWriteOptions { IsOrdered = false }); // 1. Ordered bulk operation - order of operation is guaranteed await collection.BulkWriteAsync(models); // 2. Unordered bulk operation - no guarantee of order of operation await collection.BulkWriteAsync(models, new BulkWriteOptions { IsOrdered = false });
