在.NET Core中使用MongoDB明細教程(1):驅動基礎及文檔插入
MongoDB,被歸類為NoSQL資料庫,是一個以類JSON格式存儲數據的面向文檔的資料庫系統.MongoDB在底層以名為bson的二進位編碼格式表示JSON文檔,MongoDB bson實現是輕量級、快速和高度可遍歷的。這意味著MongoDB為用戶提供了JSON文檔的易用性和靈活性,以及輕量級二進位格式的速度和豐富性。其實在我看來在很多場景中MongoDb都可以取代關係型資料庫。
作者:依樂祝
原文地址:
在本教程系列中,我將向您展示如何使用.NET驅動程式提供的CRUD函數在.NET應用程式中使用MongoDB。MongoDB驅動允許您使用來自不同程式語言的MongoDB。在本系列教程中,我們將使用C#驅動程式.
準備工作
在開始之前,我們需要打開VisualStudio並創建一個新項目。我將在本教程中使用一個控制台項目。為了演示我們需要安裝對應的NuGet包。這裡我們需要三個NuGet包,即:
- MongoDB.Bson獨立的BSON庫,它處理POCOS到BSON類型的轉換(這是MongoDB的文件格式),反之亦然。
- MongoDB.Driver.Core:–它本身就是一個驅動程式,具有驅動程式的核心組件(如如何連接到
mongod
實例,連接池),用於從.net到MongoDB的通訊,並且它依賴於MongoDB.Bson
. - MongoDB.Driver*依賴於
Driver.Core
這反過來又依賴於MongoDB.Bson
。它更容易在核心組件驅動程式上使用api,並具有非同步方法,並支援Linq.
運行以下命令,會同時安裝上面三個包:
Install-Package MongoDB.Driver
訪問資料庫
若要連接到資料庫,請使用MongoClient
類訪問MongoDB實例,並通過它選擇要使用的資料庫。這個類有四個構造函數。
- 默認情況下,連接到埠27017上的實例的無參數結構器:
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實例,我們可以做很多事情,如刪除資料庫、獲取資料庫或檢索伺服器上的資料庫名稱列表等。這裡沒有一個用於創建資料庫方法,因為一旦您選擇一個資料庫並將數據插入其中,它將自動創建資料庫。
這裡我們使用的是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元素的BsonElement
- BsonValue是各種子類使用的抽象基類,如BsonString、BsonInt 32等。
這個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實戰」第一時間進行更新!
參考資料://www.codementor.io/@pmbanugo/working-with-mongodb-in-net-1-basics-g4frivcvz