sql >> Database >  >> NoSQL >> MongoDB

Verschil tussen het verfraaien van een eigenschap in C# met BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId

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.




  1. Hoe gebruik ik een guid in een mongodb-shellquery?

  2. Hoe addToSet uit te voeren met de officiële Go-driver?

  3. MongoDB-fout:kan geen herschrijfbare schrijfbewerkingen gebruiken met limiet =0

  4. Eenvoudige manier om code te genereren met Mongoose en Node.js en Underscore?