sql >> Base de Datos >  >> NoSQL >> MongoDB

Diferencia entre decorar una propiedad en C# con BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId

1) Si tiene una columna llamada Id, id or _id , en su TDocument fuertemente escrito clase (el tipo de elemento en una colección), luego una columna llamada "_id" se generará en Mongo. También creará un índice para esa columna. Obtiene un duplicate key error excepción si intenta insertar un elemento con una clave que ya existe.

public ObjectId Id { get; set; } utilizará el generador de tipos para ObjectId y se verá como _id: ObjectId("57ade20771e59f422cc652d9") .

public Guid _id { get; set; } utilizará el generador Guid para producir algo como "_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==") .

public int Id { get; set; } , public string id { get; set; } , public byte[] _id { get; set; } también habrá columnas de índice usando los valores predeterminados para cada tipo si no se especifica.

2) [BsonId] le brinda la flexibilidad de nombrar ese índice de la forma que desee. [BsonId] public Guid SmthElseOtherThanId { get; set; } y [BsonId] public string StringId { get; set; } serán índices; public Guid SmthElseOtherThanId { get; set; } y public string StringId { get; set; } no. mongodb seguirá usando _id internamente.

Misma lógica, public ObjectId SmthElseOtherThanId {get; set;} sin [BsonId] la decoración no será una columna de índice.

3) [BsonRepresentation] le permite hacer malabares con el tipo Mongo frente al tipo interno .Net, si hay una conversión entre ellos .

Tener [BsonId] [BsonRepresentation(BsonType.ObjectId)] public ObjectId Id { get; set; } es idéntico a public ObjectId Id { get; set; } .

Tener [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } es diferente sin embargo. Mongo generará automáticamente las identificaciones de objetos por sí mismo, sin embargo, podrá usar cadenas en .net, filtrar consultas, etc., porque hay una conversión entre la identificación del objeto y la cadena.

Teniendo [BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; } o [BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; } fallará con un ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer mensaje.

Pero [BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; } estará bien.