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.