1) Als u een kolom heeft met de naam Id, id or _id , in uw sterk getypte TDocument class (het itemtype in een collectie), dan een kolom met de naam "_id" zal worden gegenereerd in Mongo. Het zal ook een index voor die kolom maken. U krijgt een duplicate key error uitzondering als u probeert een item in te voegen met een sleutel die al bestaat.
public ObjectId Id { get; set; } gebruikt de typegenerator voor ObjectId en het ziet eruit als _id: ObjectId("57ade20771e59f422cc652d9") .
public Guid _id { get; set; } zal de Guid-generator gebruiken om iets te produceren zoals "_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==") .
public int Id { get; set; } , public string id { get; set; } , public byte[] _id { get; set; } zullen ook indexkolommen zijn die de standaardwaarden voor elk type gebruiken, indien niet gespecificeerd.
2) [BsonId] geeft u de flexibiliteit om die index elke gewenste naam te geven. [BsonId] public Guid SmthElseOtherThanId { get; set; } en [BsonId] public string StringId { get; set; } zullen indexen zijn; public Guid SmthElseOtherThanId { get; set; } en public string StringId { get; set; } zal niet. mongodb gebruikt nog steeds _id intern.
Dezelfde logica, public ObjectId SmthElseOtherThanId {get; set;} zonder [BsonId] decoratie zal geen indexkolom zijn.
3) [BsonRepresentation] laat je jongleren met het Mongo-type versus het interne .Net-type, als er een conversie tussen is .
Met [BsonId] [BsonRepresentation(BsonType.ObjectId)] public ObjectId Id { get; set; } is identiek aan public ObjectId Id { get; set; } .
Met [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } is echter anders. Mongo genereert zelf automatisch object-ID's, maar u kunt tekenreeksen in .net gebruiken, zoekopdrachten filteren enz., omdat er een conversie is tussen object-ID en tekenreeks.
Met [BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; } of [BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; } zal mislukken met een ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer bericht.
Maar [BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; } komt wel goed.