1. 程式人生 > >在.NET Core中使用MongoDB明細教程(1):驅動基礎及文件插入

在.NET Core中使用MongoDB明細教程(1):驅動基礎及文件插入

![](https://img2020.cnblogs.com/blog/1377250/202008/1377250-20200812213830922-252214510.png) MongoDB,被歸類為[NoSQL](https://en.wikipedia.org/wiki/NoSQL)資料庫,是一個以類JSON格式儲存資料的面向文件的資料庫系統.MongoDB在底層以名為bson的二進位制編碼格式表示JSON文件,MongoDB bson實現是輕量級、快速和高度可遍歷的。這意味著MongoDB為使用者提供了JSON文件的易用性和靈活性,以及輕量級二進位制格式的速度和豐富性。其實在我看來在很多場景中MongoDb都可以取代關係型資料庫。 > 作者:依樂祝 > 原文地址: 在本教程系列中,我將向您展示如何使用.NET驅動程式提供的CRUD函式在.NET應用程式中使用MongoDB。MongoDB[驅動](https://docs.mongodb.com/ecosystem/drivers/)允許您使用來自不同程式語言的MongoDB。在本系列教程中,我們將使用[C#驅動程式](https://docs.mongodb.com/ecosystem/drivers/). ### 準備工作 在開始之前,我們需要開啟VisualStudio並建立一個新專案。我將在本教程中使用一個控制檯專案。為了演示我們需要安裝對應的NuGet包。這裡我們需要三個NuGet包,即: 1. [**MongoDB.Bson**](http://www.nuget.org/packages/mongodb.bson)獨立的BSON庫,它處理POCOS到BSON型別的轉換(這是MongoDB的檔案格式),反之亦然。 2. [**MongoDB.Driver.Core**](http://www.nuget.org/packages/mongodb.driver.core):--它本身就是一個驅動程式,具有驅動程式的核心元件(如如何連線到`mongod`例項,連線池),用於從.net到MongoDB的通訊,並且它依賴於`MongoDB.Bson`. 3. [**MongoDB.Driver**](http://www.nuget.org/packages/mongodb.driver)*依賴於`Driver.Core`這反過來又依賴於`MongoDB.Bson`。它更容易在核心元件驅動程式上使用api,並具有非同步方法,並支援[Linq](https://msdn.microsoft.com/en-us/library/bb308959.aspx). 執行以下命令,會同時安裝上面三個包: ``` Install-Package MongoDB.Driver ``` ### 訪問資料庫 若要連線到資料庫,請使用`MongoClient`類訪問MongoDB例項,並通過它選擇要使用的資料庫。這個類有四個建構函式。 - 預設情況下,連線到埠27017上的例項的無引數結構器: ```csharp var client = new MongoClient(); ``` - 接受連線字串: ```csharp var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); ``` - 接受一個[`MongoUrl`](http://api.mongodb.com/csharp/current/html/T_MongoDB_Driver_MongoUrl.htm)的例項,而MongoUrl跟使用`connectionstring`建構函式很類似,您可以通過使用預設建構函式來建立此類例項: ```csharp var client = new MongoClient(new MongoUrl("mongodb://localhost:27017")); ``` .或者使用靜態的`Create`方法: ```csharp var client = new MongoClient(MongoUrl.Create("mongodb://localhost:27017")); ``` - 最後一個是接受一個`MongoClientSettings`的建構函式,這裡你可以設定很多東西,比如憑據、連線生存期和超時時間等等。下面是兩個例子: ```csharp var settings1 = MongoClientSettings .FromUrl(MongoUrl.Create("mongodb://localhost:27017")); var settings2 = new MongoClientSettings { Server = new MongoServerAddress("localhost", 27017), UseSsl = false }; var client1 = new MongoClient(settings1); var client2 = new MongoClient(settings2); ``` 通常,你只需要使用包含一個`connectionString`引數的建構函式就可以了,我們將在本教程中使用此建構函式。程式碼如下所示: ```csharp using MongoDB.Driver; using System; namespace MongoDBDemo { class Program { static void Main(string[] args) { Test(); Console.ReadLine(); } static void Test() { var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); } } } ``` 使用MongoClient例項,我們可以做很多事情,如刪除資料庫、獲取資料庫或檢索伺服器上的資料庫名稱列表等。這裡沒有一個用於建立資料庫方法,因為一旦您選擇一個數據庫並將資料插入其中,它將自動建立資料庫。 這裡我們使用的是`GetDatabase`方法,它將自動為我們建立一個數據庫。如下所示獲取一個名為`bookstore` 的資料庫: ```csharp IMongoDatabase db = client.GetDatabase("bookstore"); ``` 這個[GetDatabase](http://api.mongodb.com/csharp/current/html/M_MongoDB_Driver_MongoClient_GetDatabase.htm)方法返回一個物件,該物件是資料庫的表示形式,我們可以從該物件訪問不同的集合並操作資料庫。這個`MongoClient`物件是執行緒安全的,因此您可以將其放在靜態欄位中,使其成為可以通過DI容器隨時獲得的Singleton物件,或者使用相同的連線設定例項化一個新的欄位(下面將使用相同的連線池);通過這個物件,您可以選擇您想要使用的任何資料庫。 使用資料庫物件,可以從資料庫建立、重新命名、檢索或獲取集合列表。文件儲存在集合中,如果你對SQL比較熟悉的話,可以將集合視為表,將文件視為表中的記錄。 ### 建立一個集合 若要建立集合,我們將使用 `IMongoDatabase`物件的[CreateCollection](http://api.mongodb.com/csharp/current/html/M_MongoDB_Driver_IMongoDatabase_CreateCollection.htm) 或[CreateCollection Async](http://api.mongodb.com/csharp/current/html/M_MongoDB_Driver_IMongoDatabase_CreateCollectionAsync.htm)方法來進行 。該方法接受三個引數(最後兩個引數是可選的): 1. 集合的名稱。 2. 建立集合的選項 3. 取消令牌 ```csharp void CreateCollection( string name, CreateCollectionOptions options = null, CancellationToken cancellationToken = default); Task CreateCollectionAsync( string name, CreateCollectionOptions options = null, CancellationToken cancellationToken = default); ``` 這個[CreateCollectionOptions](http://api.mongodb.com/csharp/current/html/T_MongoDB_Driver_CreateCollectionOptions.htm)指定集合的特殊設定,例如它應該包含的最大文件數。下面是一個例子: ```csharp IMongoDatabase database = client.GetDatabase("bookstore"); await database.CreateCollectionAsync("books", new CreateCollectionOptions { Capped=true, MaxDocuments=100, }); ``` 大多數情況下,我們只需要建立一個集合,並使用預設的建立設定,因此我們只需要傳遞一個`collection`的名稱即可。 ```csharp await database.CreateCollectionAsync("books"); ``` 建立集合的另一種方法是使用[GetCollection](http://api.mongodb.com/csharp/current/html/M_MongoDB_Driver_IMongoDatabase_GetCollection__1.htm)它接受集合的名稱和集合設定選項作為引數。使用此方法,即使不存在該名稱的集合,一旦建立文件,它也會在此之前建立該集合。這通常是您想要的方式,因此這裡建議只在你需要建立一個有上限的集合時才使用CREATE進行集合的建立。 [Capped](https://docs.mongodb.com/manual/core/capped-collections/)集合是一個固定大小的集合,當它達到最大值時,它會自動覆蓋其最舊的條目。GetCollection方法是泛型的,在呼叫此方法時需要指定文件型別。該型別表示要處理的物件/文件的型別。它可以被強型別化為我們定義的任何類,或者使用`BsonDocument`型別表示一個允許我們處理集合中任何文件形狀的動態架構。 ### 獲取一個集合 在討論了建立集合之後,還需要一個額外的步驟來檢查集合是否存在,建立它,然後將文件新增到集合中。如果集合不存在,`GetCollection`會自動建立一個集合,並將文件新增到該集合中。因此,即使有一個`CreateCollection`,我們通常還是希望使用`GetCollection`。就像資料庫一樣,集合也是執行緒安全的,並且建立起來非常j簡單。為了獲得一個集合,我們呼叫`GetCollection`方法來指定文件型別 ```csharp static async Task TestAsync() { var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("bookstore"); IMongoCollection collection = database.GetCollection("books"); } ``` [BsonDocument](http://api.mongodb.com/csharp/current/html/T_MongoDB_Bson_BsonDocument.htm)是來自MongoDB.Bson包的型別,它表示BSON文件,使用這種型別,我們可以處理來自資料庫的任何形狀的資料。這[包](http://api.mongodb.com/csharp/current/html/N_MongoDB_Bson.htm)包含了所有基本BSON型別和其他一些用於使用BSON的方法。 在這個包中,我們有表示BSON型別的類,以及如何在.NET型別和BsonValue之間對映。下面簡單列舉一些: - 我們已經討論過的BsonDocument型別 - 表示BSON元素的BsonElement - BsonValue是各種子類使用的抽象基類,如BsonString、BsonInt 32等。 這個`BsonDocument`是字串到bson值的字典,因此我們可以像初始化字典一樣來進行初始化: ```csharp var document = new BsonDocument { {"bookname", BsonValue.Create(".net core3.1 with mongodb")}, {"description", new BsonString("這是一本關於在.net core3.1中使用mongodb進行開發的教程")}, {"tags", new BsonArray(new[] {".net core", "mongodb"}) }, {"remark", "C#是世界上最好的語言" }, {"publishyear", 2020 } }; ``` .或者使用`Add`方法,該方法具有多個過載: ```csharp var document2 = new BsonDocument(); document2.Add("bookname", ".net core3.1 with mongodb2"); document2.Add("description", "這是一本關於在.net core3.1中使用mongodb進行開發的教程2"); document2.Add("tags", new BsonArray(new[] { ".net core", "mongodb" })); document2.Add("remark", "C#是世界上最好的語言"); document2.Add("publishyear", 2020); ``` .或者使用索引器: ```csharp var document3 = new BsonDocument(); document3["bookname"] = ".net core3.1 with mongodb3"; document3["description"] = "這是一本關於在.net core3.1中使用mongodb進行開發的教程3"; document3["tags"] = new BsonArray(new[] { ".net core", "mongodb" }); document3["remark"] = "C#是世界上最好的語言"; document3["publishyear"] = 2020; ``` ### 建立/插入文件 文件儲存在集合中,在查看了建立和獲取集合之後,我們將繼續在集合中插入新文件。Mongo集合例項提供了一次插入單個文件和一次插入多個文件的方法。 接下來讓我們一步一步來進行實現吧: - 獲取一個`IMongocollection`型別的物件,該物件表示我們要使用的集合: ```csharp IMongoCollection collection = database.GetCollection("books"); ``` - 然後建立我們想要插入的文件: ```csharp var document = new BsonDocument { {"bookname", BsonValue.Create(".net core3.1 with mongodb")}, {"description", new BsonString("這是一本關於在.net core3.1中使用mongodb進行開發的教程")}, {"tags", new BsonArray(new[] {".net core", "mongodb"}) }, {"remark", "C#是世界上最好的語言" }, {"publishyear", 2020 } }; ``` - 最後插入該檔案: ```csharp await collection.InsertOneAsync(document); ``` 要想看到這個效果,讓我們開始一個`mongod`例項,並從控制檯監視事件的同時執行以下完整程式碼: ```csharp class Program { static async Task Main(string[] args) { await TestAsync(); Console.ReadLine(); } /// /// 測試程式碼 ///
/// static async Task TestAsync() { var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("bookstore"); IMongoCollection collection = database.GetCollection("books"); var document = new BsonDocument { {"bookname", BsonValue.Create(".net core3.1 with mongodb")}, {"description", new BsonString("這是一本關於在.net core3.1中使用mongodb進行開發的教程")}, {"tags", new BsonArray(new[] {".net core", "mongodb"}) }, {"remark", "C#是世界上最好的語言" }, {"publishyear", 2020 } }; await collection.InsertOneAsync(document); } } ``` ...啟動你的mongo服務並執行程式,看到如下所示的資料: ![](https://img2020.cnblogs.com/blog/1377250/202008/1377250-20200812213921826-1033313422.png) 這裡的`InsertOneAsync`方法還有一個同步的版本 ```csharp collection.InsertOne(document); ``` 我們還可以使用`InsertMany`或`InsertManyAsync`方法進行批量插入。假設我們圖書館又來了三本新書,我們可以使用這個方法同時插入所有的內容,並且它們將被插入到一個批中(假設您使用的是MongoDB2.6或更高版本)。要檢視此操作,我們將繼續更新程式碼並執行應用程式: ```csharp class Program { static async Task Main(string[] args) { await TestAsync(); Console.ReadLine(); } /// /// 測試程式碼 ///
/// static async Task TestAsync() { var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("bookstore"); IMongoCollection collection = database.GetCollection("books"); await collection.InsertManyAsync(GetBooks()); } static IEnumerable GetBooks() => new List { new BsonDocument { {"bookname", BsonValue.Create(".net core3.1 with mongodb1")}, {"description", new BsonString("這是一本關於在.net core3.1中使用mongodb進行開發的教程1")}, {"tags", new BsonArray(new[] {".net core", "mongodb"}) }, {"remark", "C#是世界上最好的語言" }, {"publishyear", 2020 } }, new BsonDocument { {"bookname", BsonValue.Create(".net core3.1 with mongodb2")}, {"description", new BsonString("這是一本關於在.net core3.1中使用mongodb進行開發的教程2")}, {"tags", new BsonArray(new[] {".net core", "mongodb"}) }, {"remark", "C#是世界上最好的語言" }, {"publishyear", 2020 } }, new BsonDocument { {"bookname", BsonValue.Create(".net core3.1 with mongodb2")}, {"description", new BsonString("這是一本關於在.net core3.1中使用mongodb進行開發的教程2")}, {"tags", new BsonArray(new[] {".net core", "mongodb"}) }, {"remark", "C#是世界上最好的語言" }, {"publishyear", 2020 } }, }; } ``` 這時候我們再進行夏查詢,看到所有資料都入庫了 ![1597204359324.png](https://upload-images.jianshu.io/upload_images/2767091-d06745388e0fa700.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 除了使用`BsonDocument`,我們通常預先知道我們想要處理的是什麼樣的資料,並且我們可以為它們建立自定義的.NET類。遵循我們使用`books`集合的事例,讓我們建立一個`Book`類並插入使用此類表示的新書籍: ```csharp internal class Book { public string BookName { get; set; } public string Description { get; set; } public IEnumerable Tags { get; set; } public string Remark { get; set; } public int PublishYear { get; set; } } class Program { static async Task Main(string[] args) { await TestAsync(); Console.ReadLine(); } /// /// 測試程式碼 ///
/// static async Task TestAsync() { var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("bookstore"); IMongoCollection collection = database.GetCollection("books"); await collection.InsertManyAsync(GetBooks()); } static IEnumerable GetBooks() => new List { new Book { BookName=".net core3.1 with mongodb21", Description="這是一本關於在.net core3.1中使用mongodb進行開發的教程21", Tags=new List{ ".net core", "mongodb"}, Remark="C#是世界上最好的語言", PublishYear=2020, }, new Book { BookName=".net core3.1 with mongodb22", Description="這是一本關於在.net core3.1中使用mongodb進行開發的教程22", Tags=new List{ ".net core", "mongodb"}, Remark="C#是世界上最好的語言", PublishYear=2020, }, new Book { BookName=".net core3.1 with mongodb23", Description="這是一本關於在.net core3.1中使用mongodb進行開發的教程23", Tags=new List{ ".net core", "mongodb"}, Remark="C#是世界上最好的語言", PublishYear=2020, }, }; } ``` 使用上面的程式碼,我們可以將集合的文件型別更改為新類,並呼叫`InsertManyAsync`方法。執行下程式,然後查詢下集合資料如下所示: ![](https://img2020.cnblogs.com/blog/1377250/202008/1377250-20200812213950938-870099150.png) ### 總結 通過上面的示例程式碼的講解,你應該對如何通過MongoDB .NET 驅動程式來操作MongoDB集合跟文件有所瞭解了,並且你也應該知道如何進行文件的插入,在下一篇文章中,我將介紹如何對文件進行檢索以及為此構建的各種filter及linq查詢技巧,有興趣的可以關注下我的公眾號“DotNetCore實戰”第一時間進行更新! 參考資料:https://www.codementor.io/@pmbanugo/working-with-mongodb-in-net-1-basics-g4frivcvz