MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Differenza tra decorare una proprietà in C# con BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId

1) Se hai una colonna denominata Id, id or _id , nel tuo TDocument fortemente digitato class (il tipo di elemento in una raccolta), quindi una colonna denominata "_id" sarà generato in Mongo. Creerà anche un indice per quella colonna. Viene visualizzato un duplicate key error eccezione se si tenta di inserire un elemento con una chiave già esistente.

public ObjectId Id { get; set; } utilizzerà il generatore di tipi per ObjectId e sarà simile a _id: ObjectId("57ade20771e59f422cc652d9") .

public Guid _id { get; set; } utilizzerà il generatore di Guid per produrre smth come "_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==") .

public int Id { get; set; } , public string id { get; set; } , public byte[] _id { get; set; } saranno anche colonne di indice che utilizzano i valori predefiniti per ogni tipo se non specificato.

2) [BsonId] ti dà la flessibilità di nominare quell'indice come preferisci. [BsonId] public Guid SmthElseOtherThanId { get; set; } e [BsonId] public string StringId { get; set; } saranno indici; public Guid SmthElseOtherThanId { get; set; } e public string StringId { get; set; } non. mongodb utilizzerà ancora _id internamente.

Stessa logica, public ObjectId SmthElseOtherThanId {get; set;} senza [BsonId] la decorazione non sarà una colonna di indice.

3) [BsonRepresentation] ti consente di destreggiarti tra il tipo Mongo e il tipo .Net interno, se c'è una conversione tra loro .

Avere [BsonId] [BsonRepresentation(BsonType.ObjectId)] public ObjectId Id { get; set; } è identico a public ObjectId Id { get; set; } .

Avere [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } è diverso però. Mongo genererà automaticamente gli ID oggetto da solo, tuttavia sarai in grado di utilizzare stringhe in .net, filtrare query ecc., perché esiste una conversione tra ID oggetto e stringa.

Avere [BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; } o [BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; } fallirà con un ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer messaggio.

Ma [BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; } andrà bene.