1) Jeśli masz kolumnę o nazwie Id, id or _id
, w silnie wpisanym TDocument
klasa (typ elementu w kolekcji), a następnie kolumna o nazwie "_id"
zostanie wygenerowany w Mongo. Stworzy również indeks dla tej kolumny. Otrzymujesz duplicate key error
wyjątek, jeśli próbujesz wstawić element z kluczem, który już istnieje.
public ObjectId Id { get; set; }
użyje generatora typów dla ObjectId
i będzie wyglądać jak _id: ObjectId("57ade20771e59f422cc652d9")
.
public Guid _id { get; set; }
użyje generatora Guid do wytworzenia czegoś takiego jak "_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==")
.
public int Id { get; set; }
, public string id { get; set; }
, public byte[] _id { get; set; }
będą również indeksowane kolumny przy użyciu wartości domyślnych dla każdego typu, jeśli nie zostaną określone.
2) [BsonId]
daje Ci elastyczność w nazywaniu tego indeksu w dowolny sposób. [BsonId] public Guid SmthElseOtherThanId { get; set; }
i [BsonId] public string StringId { get; set; }
będą indeksy; public Guid SmthElseOtherThanId { get; set; }
i public string StringId { get; set; }
przyzwyczajenie. mongodb nadal będzie używać _id
wewnętrznie.
Ta sama logika, public ObjectId SmthElseOtherThanId {get; set;}
bez [BsonId]
dekoracja nie będzie kolumną indeksu.
3) [BsonRepresentation]
pozwala żonglować między typem Mongo a wewnętrznym typem .Net, jeśli jest między nimi konwersja .
Mając [BsonId] [BsonRepresentation(BsonType.ObjectId)] public ObjectId Id { get; set; }
jest identyczny z public ObjectId Id { get; set; }
.
Mając [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; }
jest jednak inna. Mongo sam automatycznie wygeneruje identyfikatory obiektów, jednak będziesz mógł używać ciągów w .net, filtrować zapytania itp., ponieważ zachodzi konwersja między identyfikatorem obiektu a ciągiem.
Mając [BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; }
lub [BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; }
nie powiedzie się, ponieważ ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer
wiadomość.
Ale [BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; }
będzie dobrze.