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; }
ще бъде добре.