mongodb 官方提供的 c# driver 2.0 算是對新手很友善,比起 1.0 各種 schema 處理都要自己來,現在的版本看起來相當簡潔直觀。
以下我們就利用簡單的 CRUD 小程式來研究存取 id 的問題
安裝方法 (MongoDB C# driver)
對專案右鍵>管理 nuget 套件,找到 MongoDB.Driver ,按安裝,完成。

不使用 id
作為範例,我現在有一個 model 長這樣
public class Blog{ public string title { get; set; } = ""; public string author { get; set; } = ""; public string url { get; set; } = ""; public int likes { get; set; } = 0;}我可以在完全不加任何欄位的情況下把他存進 mongodb 裡面,像是下面一樣直接呼叫
public async Task CreateAsync(Blog blog){ await _blogs.InsertOneAsync(blog);}mongodb driver 在存入資料時會自動生成一個 BsonId (ObjectId),名叫 _id
可是因為我們沒有在模型中指定 id,我們無法在程式理取得特定資料來做更新或刪除,所以如果有刪改的需求,勢必還是要在 model 裡面加上 id 欄位
利用 ObjectId 作為 id
要取得這個 _id 值,可以簡單的在 model 裡面添加以下這段就能讀到了。
using MongoDB.Bson;
public class Blog{ [BsonId] public ObjectId id { get; set; }
//...其中 [BsonId] 這個 attribute 是告訴 mongodb 程式裡面的 id 對應到資料庫的 _id。如果你不加這個 attribute 也沒問題,mongodb 會自己找名為 id 或 Id 的欄位,當你把 id 改稱其他名字就必須要加。
但是我們在序列化出 json 會發現,它把 ObjectId 裡面的所有東西都掏出來了

我們是可以利用 [JsonIgnore] 這個 attribute 把它忽略掉,但這樣我們又回到原地了。
利用 string 裡面存 ObjectId 作為 id
如果我們可以直接用 string 來接資料庫的 ObjectId,那就不會有序列化的問題了,但是如果直接把 id 的 Object Type 改 string ,程式又會直接爆掉。

其實,我們可以利用 [BsonRepresentation] 這個 attribute 來指定欄位在資料庫對應的類型。
public class Blog{ [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string id { get; set; } = "";}在上面的 code 就是告訴程式 id 對應到資料庫的類型是 ObjectId,要麻煩把 id 從 ObjectId 類型轉成 string 再丟進來。這個 attribute 不只在這裡很好用,其他地方如自定義類別要用時也很方便。

p.s. 其實不只限 ObjectId,你也可以把 id 指定為 int 之類的其他類別,要注意碰撞的問題就是了。