1) Ако имате колона с име Id, id or _id , във вашия строго въведен TDocument клас (типът на елемента в колекция), след това колона с име "_id" ще бъде генериран в Mongo. Той също така ще създаде индекс за тази колона. Получавате duplicate key error изключение, ако се опитвате да вмъкнете елемент с ключ, който вече съществува.
public ObjectId Id { get; set; } ще използва генератора на типове за ObjectId и ще изглежда така _id: ObjectId("57ade20771e59f422cc652d9") .
public Guid _id { get; set; } ще използва генератора на Guid, за да произведе нещо като "_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==") .
public int Id { get; set; } , public string id { get; set; } , public byte[] _id { get; set; } също ще бъдат индексни колони, използващи стойностите по подразбиране за всеки тип, ако не са посочени.
2) [BsonId] ви дава гъвкавостта да наименувате този индекс по какъвто и да е начин. [BsonId] public Guid SmthElseOtherThanId { get; set; } и [BsonId] public string StringId { get; set; } ще бъдат индекси; public Guid SmthElseOtherThanId { get; set; } и public string StringId { get; set; } няма да mongodb все още ще използва _id вътрешно.
Същата логика, public ObjectId SmthElseOtherThanId {get; set;} без [BsonId] декорацията няма да бъде индексна колона.
3) [BsonRepresentation] ви позволява да жонглираш с типа Mongo срещу вътрешния тип .Net, ако има преобразуване между тях .
Имайки [BsonId] [BsonRepresentation(BsonType.ObjectId)] public ObjectId Id { get; set; } е идентичен с public ObjectId Id { get; set; } .
Имащ [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } е различно обаче. Mongo автоматично ще генерира идентификатори на обекти сам, но вие ще можете да използвате низове в .net, филтриращи заявки и т.н., тъй като има преобразуване между идентификатор на обект и низ.
Имащ [BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; } или [BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; } ще се провали с ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer съобщение.
Но [BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; } ще бъде добре.