用好數據映射,MongoDB via Dotnet Core開發變會成一件超級快樂的事。 一、前言 MongoDB這幾年已經成為NoSQL的頭部資料庫。 由於MongoDB free schema的特性,使得它在互聯網應用方面優於常規資料庫,成為了相當一部分大廠的主數據選擇;而它的快速佈署和開發簡單 ...
用好數據映射,MongoDB via Dotnet Core開發變會成一件超級快樂的事。
一、前言
MongoDB這幾年已經成為NoSQL的頭部資料庫。
由於MongoDB free schema的特性,使得它在互聯網應用方面優於常規資料庫,成為了相當一部分大廠的主數據選擇;而它的快速佈署和開發簡單的特點,也吸引著大量小開發團隊的支持。
關於MongoDB快速佈署,我在15分鐘從零開始搭建支持10w+用戶的生產環境(二)里有寫,需要了可以去看看。
作為一個資料庫,基本的操作就是CRUD。MongoDB的CRUD,不使用SQL來寫,而是提供了更簡單的方式。
方式一、BsonDocument方式
BsonDocument方式,適合能熟練使用MongoDB Shell的開發者。MongoDB Driver提供了完全覆蓋Shell命令的各種方式,來處理用戶的CRUD操作。
這種方法自由度很高,可以在不需要知道完整數據集結構的情況下,完成資料庫的CRUD操作。
方式二、數據映射方式
數據映射是最常用的一種方式。準備好需要處理的數據類,直接把數據類映射到MongoDB,並對數據集進行CRUD操作。
下麵,對數據映射的各個部分,我會逐個說明。
為了防止不提供原網址的轉載,特在這裡加上原文鏈接:https://www.cnblogs.com/tiger-wang/p/13185605.html
二、開發環境&基礎工程
這個Demo的開發環境是:Mac + VS Code + Dotnet Core 3.1.2。
建立工程:
% dotnet new sln -o demo
The template "Solution File" was created successfully.
% cd demo
% dotnet new console -o demo
The template "Console Application" was created successfully.
Processing post-creation actions...
Running 'dotnet restore' on demo/demo.csproj...
Determining projects to restore...
Restored demo/demo/demo.csproj (in 162 ms).
Restore succeeded.
% dotnet sln add demo/demo.csproj
Project `demo/demo.csproj` added to the solution.
建立工程完成。
下麵,增加包mongodb.driver
到工程:
% cd demo
% dotnet add package mongodb.driver
Determining projects to restore...
info : Adding PackageReference for package 'mongodb.driver' into project 'demo/demo/demo.csproj'.
info : Committing restore...
info : Writing assets file to disk. Path: demo/demo/obj/project.assets.json
log : Restored /demo/demo/demo.csproj (in 6.01 sec).
項目準備完成。
看一下目錄結構:
% tree .
.
├── demo
│ ├── Program.cs
│ ├── demo.csproj
│ └── obj
│ ├── demo.csproj.nuget.dgspec.json
│ ├── demo.csproj.nuget.g.props
│ ├── demo.csproj.nuget.g.targets
│ ├── project.assets.json
│ └── project.nuget.cache
└── demo.sln
mongodb.driver
是MongoDB官方的資料庫SDK,從Nuget上安裝即可。
三、Demo準備工作
創建數據映射的模型類CollectionModel.cs
,現在是個空類,後面所有的數據映射相關內容會在這個類進行說明:
public class CollectionModel
{
}
並修改Program.cs
,準備Demo
方法,以及連接資料庫:
class Program
{
private const string MongoDBConnection = "mongodb://localhost:27031/admin";
private static IMongoClient _client = new MongoClient(MongoDBConnection);
private static IMongoDatabase _database = _client.GetDatabase("Test");
private static IMongoCollection<CollectionModel> _collection = _database.GetCollection<CollectionModel>("TestCollection");
static async Task Main(string[] args)
{
await Demo();
Console.ReadKey();
}
private static async Task Demo()
{
}
}
四、欄位映射
從上面的代碼中,我們看到,在生成Collection
對象時,用到了CollectionModel
:
IMongoDatabase _database = _client.GetDatabase("Test");
IMongoCollection<CollectionModel> _collection = _database.GetCollection<CollectionModel>("TestCollection");
這兩行,其實就完成了一個映射的工作:把MongoDB
中,Test
資料庫下,TestCollection
數據集(就是SQL中的數據表),映射到CollectionModel
這個數據類中。換句話說,就是用CollectionModel
這個類,來完成對數據集TestCollection
的所有操作。
保持CollectionModel
為空,我們往資料庫寫入一行數據:
private static async Task Demo()
{
CollectionModel new_item = new CollectionModel();
await _collection.InsertOneAsync(new_item);
}
執行,看一下寫入的數據:
{
"_id" : ObjectId("5ef1d8325327fd4340425ac9")
}
OK,我們已經寫進去一條數據了。因為映射類是空的,所以寫入的數據,也只有_id
一行內容。
但是,為什麼會有一個_id
呢?
1. ID欄位
MongoDB數據集中存放的數據,稱之為文檔(Document
)。每個文檔在存放時,都需要有一個ID,而這個ID的名稱,固定叫_id
。
當我們建立映射時,如果給出_id
欄位,則MongoDB會採用這個ID做為這個文檔的ID,如果不給出,MongoDB會自動添加一個_id
欄位。
例如:
public class CollectionModel
{
public ObjectId _id { get; set; }
public string title { get; set; }
public string content { get; set; }
}
和
public class CollectionModel
{
public string title { get; set; }
public string content { get; set; }
}
在使用上是完全一樣的。唯一的區別是,如果映射類中不寫_id
,則MongoDB自動添加_id
時,會用ObjectId
作為這個欄位的數據類型。
ObjectId
是一個全局唯一的數據。
當然,MongoDB允許使用其它類型的數據作為ID,例如:string
,int
,long
,GUID
等,但這就需要你自己去保證這些數據不超限並且唯一。
例如,我們可以寫成:
public class CollectionModel
{
public long _id { get; set; }
public string title { get; set; }
public string content { get; set; }
}
我們也可以在類中修改_id
名稱為別的內容,但需要加一個描述屬性BsonId
:
public class CollectionModel
{
[BsonId]
public ObjectId topic_id { get; set; }
public string title { get; set; }
public string content { get; set; }
}
這兒特別要註意:BsonId
屬性會告訴映射,topic_id
就是這個文檔數據的ID。MongoDB在保存時,會將這個topic_id
轉成_id
保存到數據集中。
在MongoDB數據集中,ID欄位的名稱固定叫_id
。為了代碼的閱讀方便,可以在類中改為別的名稱,但這不會影響MongoDB中存放的ID名稱。
修改Demo代碼:
private static async Task Demo()
{
CollectionModel new_item = new CollectionModel()
{
title = "Demo",
content = "Demo content",
};
await _collection.InsertOneAsync(new_item);
}
跑一下Demo,看看保存的結果:
{
"_id" : ObjectId("5ef1e1b1bc1e18086afe3183"),
"title" : "Demo",
"content" : "Demo content"
}
2. 簡單欄位
就是常規的數據欄位,直接寫就成。
public class CollectionModel
{
[BsonId]
public ObjectId topic_id { get; set; }
public string title { get; set; }
public string content { get; set; }
public