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.