MongoDB,被歸類爲NoSQL數據庫,是一個以類JSON格式存儲數據的面向文檔的數據庫系統.MongoDB在底層以名爲bson的二進制編碼格式表示JSON文檔,MongoDB bson實現是輕量級、快速和高度可遍歷的。這意味着MongoDB爲用戶提供了JSON文檔的易用性和靈活性,以及輕量級二進制格式的速度和豐富性。其實在我看來在不少場景中MongoDb均可以取代關係型數據庫。html
做者:依樂祝
原文地址:http://www.javashuo.com/article/p-prymvnrs-no.htmlmongodb
在本教程系列中,我將向您展現如何使用.NET驅動程序提供的CRUD函數在.NET應用程序中使用MongoDB。MongoDB驅動容許您使用來自不一樣編程語言的MongoDB。在本系列教程中,咱們將使用C#驅動程序.數據庫
在開始以前,咱們須要打開VisualStudio並建立一個新項目。我將在本教程中使用一個控制檯項目。爲了演示咱們須要安裝對應的NuGet包。這裏咱們須要三個NuGet包,即:編程
mongod
實例,鏈接池),用於從.net到MongoDB的通訊,而且它依賴於MongoDB.Bson
.Driver.Core
這反過來又依賴於MongoDB.Bson
。它更容易在覈心組件驅動程序上使用api,並具備異步方法,並支持Linq.運行如下命令,會同時安裝上面三個包:api
Install-Package MongoDB.Driver
若要鏈接到數據庫,請使用MongoClient
類訪問MongoDB實例,並經過它選擇要使用的數據庫。這個類有四個構造函數。安全
var client = new MongoClient();
var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString);
MongoUrl
的實例,而MongoUrl跟使用connectionstring
構造函數很相似,您能夠經過使用默認構造函數來建立此類實例:var client = new MongoClient(new MongoUrl("mongodb://localhost:27017"));
.或者使用靜態的Create
方法:服務器
var client = new MongoClient(MongoUrl.Create("mongodb://localhost:27017"));
MongoClientSettings
的構造函數,這裏你能夠設置不少東西,好比憑據、鏈接生存期和超時時間等等。下面是兩個例子: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
參數的構造函數就能夠了,咱們將在本教程中使用此構造函數。代碼以下所示:架構
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實例,咱們能夠作不少事情,如刪除數據庫、獲取數據庫或檢索服務器上的數據庫名稱列表等。這裏沒有一個用於建立數據庫方法,由於一旦您選擇一個數據庫並將數據插入其中,它將自動建立數據庫。app
這裏咱們使用的是GetDatabase
方法,它將自動爲咱們建立一個數據庫。以下所示獲取一個名爲bookstore
的數據庫:異步
IMongoDatabase db = client.GetDatabase("bookstore");
這個GetDatabase方法返回一個對象,該對象是數據庫的表示形式,咱們能夠從該對象訪問不一樣的集合並操做數據庫。這個MongoClient
對象是線程安全的,所以您能夠將其放在靜態字段中,使其成爲能夠經過DI容器隨時得到的Singleton對象,或者使用相同的鏈接設置實例化一個新的字段(下面將使用相同的鏈接池);經過這個對象,您能夠選擇您想要使用的任何數據庫。
使用數據庫對象,能夠從數據庫建立、重命名、檢索或獲取集合列表。文檔存儲在集合中,若是你對SQL比較熟悉的話,能夠將集合視爲表,將文檔視爲表中的記錄。
若要建立集合,咱們將使用 IMongoDatabase
對象的CreateCollection 或CreateCollection Async方法來進行 。該方法接受三個參數(最後兩個參數是可選的):
void CreateCollection( string name, CreateCollectionOptions options = null, CancellationToken cancellationToken = default); Task CreateCollectionAsync( string name, CreateCollectionOptions options = null, CancellationToken cancellationToken = default);
這個CreateCollectionOptions指定集合的特殊設置,例如它應該包含的最大文檔數。下面是一個例子:
IMongoDatabase database = client.GetDatabase("bookstore"); await database.CreateCollectionAsync("books", new CreateCollectionOptions { Capped=true, MaxDocuments=100, });
大多數狀況下,咱們只須要建立一個集合,並使用默認的建立設置,所以咱們只須要傳遞一個collection
的名稱便可。
await database.CreateCollectionAsync("books");
建立集合的另外一種方法是使用GetCollection它接受集合的名稱和集合設置選項做爲參數。使用此方法,即便不存在該名稱的集合,一旦建立文檔,它也會在此以前建立該集合。這一般是您想要的方式,所以這裏建議只在你須要建立一個有上限的集合時才使用CREATE進行集合的建立。
Capped集合是一個固定大小的集合,當它達到最大值時,它會自動覆蓋其最舊的條目。GetCollection方法是泛型的,在調用此方法時須要指定文檔類型。該類型表示要處理的對象/文檔的類型。它能夠被強類型化爲咱們定義的任何類,或者使用BsonDocument
類型表示一個容許咱們處理集合中任何文檔形狀的動態架構。
在討論了建立集合以後,還須要一個額外的步驟來檢查集合是否存在,建立它,而後將文檔添加到集合中。若是集合不存在,GetCollection
會自動建立一個集合,並將文檔添加到該集合中。所以,即便有一個CreateCollection
,咱們一般仍是但願使用GetCollection
。就像數據庫同樣,集合也是線程安全的,而且建立起來很是j簡單。爲了得到一個集合,咱們調用GetCollection
方法來指定文檔類型
static async Task TestAsync() { var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("bookstore"); IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books"); }
BsonDocument是來自MongoDB.Bson包的類型,它表示BSON文檔,使用這種類型,咱們能夠處理來自數據庫的任何形狀的數據。這包包含了全部基本BSON類型和其餘一些用於使用BSON的方法。
在這個包中,咱們有表示BSON類型的類,以及如何在.NET類型和BsonValue之間映射。下面簡單列舉一些:
這個BsonDocument
是字符串到bson值的字典,所以咱們能夠像初始化字典同樣來進行初始化:
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
方法,該方法具備多個重載:
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);
.或者使用索引器:
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
類型的對象,該對象表示咱們要使用的集合:IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("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);
要想看到這個效果,讓咱們開始一個mongod
實例,並從控制檯監視事件的同時運行如下完整代碼:
class Program { static async Task Main(string[] args) { await TestAsync(); Console.ReadLine(); } /// <summary> /// 測試代碼 /// </summary> /// <returns></returns> static async Task TestAsync() { var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("bookstore"); IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("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服務並運行程序,看到以下所示的數據:
這裏的InsertOneAsync
方法還有一個同步的版本
collection.InsertOne(document);
咱們還可使用InsertMany
或InsertManyAsync
方法進行批量插入。假設咱們圖書館又來了三本新書,咱們可使用這個方法同時插入全部的內容,而且它們將被插入到一個批中(假設您使用的是MongoDB2.6或更高版本)。要查看此操做,咱們將繼續更新代碼並運行應用程序:
class Program { static async Task Main(string[] args) { await TestAsync(); Console.ReadLine(); } /// <summary> /// 測試代碼 /// </summary> /// <returns></returns> static async Task TestAsync() { var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("bookstore"); IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("books"); await collection.InsertManyAsync(GetBooks()); } static IEnumerable<BsonDocument> GetBooks() => new List<BsonDocument> { 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 } }, }; }
這時候咱們再進行夏查詢,看到全部數據都入庫了
除了使用BsonDocument
,咱們一般預先知道咱們想要處理的是什麼樣的數據,而且咱們能夠爲它們建立自定義的.NET類。遵循咱們使用books
集合的事例,讓咱們建立一個Book
類並插入使用此類表示的新書籍:
internal class Book { public string BookName { get; set; } public string Description { get; set; } public IEnumerable<string> 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(); } /// <summary> /// 測試代碼 /// </summary> /// <returns></returns> static async Task TestAsync() { var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("bookstore"); IMongoCollection<Book> collection = database.GetCollection<Book>("books"); await collection.InsertManyAsync(GetBooks()); } static IEnumerable<Book> GetBooks() => new List<Book> { new Book { BookName=".net core3.1 with mongodb21", Description="這是一本關於在.net core3.1中使用mongodb進行開發的教程21", Tags=new List<string>{ ".net core", "mongodb"}, Remark="C#是世界上最好的語言", PublishYear=2020, }, new Book { BookName=".net core3.1 with mongodb22", Description="這是一本關於在.net core3.1中使用mongodb進行開發的教程22", Tags=new List<string>{ ".net core", "mongodb"}, Remark="C#是世界上最好的語言", PublishYear=2020, }, new Book { BookName=".net core3.1 with mongodb23", Description="這是一本關於在.net core3.1中使用mongodb進行開發的教程23", Tags=new List<string>{ ".net core", "mongodb"}, Remark="C#是世界上最好的語言", PublishYear=2020, }, }; }
使用上面的代碼,咱們能夠將集合的文檔類型更改成新類,並調用InsertManyAsync
方法。運行下程序,而後查詢下集合數據以下所示:
經過上面的示例代碼的講解,你應該對如何經過MongoDB .NET 驅動程序來操做MongoDB集合跟文檔有所瞭解了,而且你也應該知道如何進行文檔的插入,在下一篇文章中,我將介紹如何對文檔進行檢索以及爲此構建的各類filter及linq查詢技巧,有興趣的能夠關注下個人公衆號「DotNetCore實戰」第一時間進行更新!
參考資料:https://www.codementor.io/@pmbanugo/working-with-mongodb-in-net-1-basics-g4frivcvz