1) Jika Anda memiliki kolom bernama Id, id or _id , di TDocument yang diketik dengan kuat class (tipe item dalam koleksi), lalu kolom bernama "_id" akan dihasilkan di Mongo. Itu juga akan membuat indeks untuk kolom itu. Anda mendapatkan duplicate key error pengecualian jika mencoba memasukkan item dengan kunci yang sudah ada.
public ObjectId Id { get; set; } akan menggunakan generator tipe untuk ObjectId dan akan terlihat seperti _id: ObjectId("57ade20771e59f422cc652d9") .
public Guid _id { get; set; } akan menggunakan generator Guid untuk menghasilkan sesuatu seperti "_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==") .
public int Id { get; set; } , public string id { get; set; } , public byte[] _id { get; set; } juga akan menjadi kolom indeks menggunakan default untuk setiap jenis jika tidak ditentukan.
2) [BsonId] memberi Anda fleksibilitas untuk menamai indeks itu dengan cara apa pun yang Anda inginkan. [BsonId] public Guid SmthElseOtherThanId { get; set; } dan [BsonId] public string StringId { get; set; } akan menjadi indeks; public Guid SmthElseOtherThanId { get; set; } dan public string StringId { get; set; } tidak akan. mongodb akan tetap menggunakan _id secara internal.
Logika yang sama, public ObjectId SmthElseOtherThanId {get; set;} tanpa [BsonId] dekorasi tidak akan menjadi kolom indeks.
3) [BsonRepresentation] memungkinkan Anda menyulap dengan tipe Mongo vs tipe .Net internal, jika ada konversi di antara keduanya .
Memiliki [BsonId] [BsonRepresentation(BsonType.ObjectId)] public ObjectId Id { get; set; } identik dengan public ObjectId Id { get; set; } .
Memiliki [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } berbeda namun. Mongo akan secara otomatis menghasilkan id objek sendiri, namun Anda akan dapat menggunakan string di .net, memfilter kueri, dll., karena ada konversi antara id objek dan string.
Memiliki [BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; } atau [BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; } akan gagal dengan ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer pesan.
Tapi [BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; } akan baik-baik saja.