MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Diferença entre decorar uma propriedade em C# com BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId


1) Se você tiver uma coluna chamada Id, id or _id , em seu TDocument fortemente tipado class (o tipo de item em uma coleção) e uma coluna chamada "_id" será gerado no Mongo. Ele também criará um índice para essa coluna. Você recebe um duplicate key error exceção se tentar inserir um item com uma chave que já existe.

public ObjectId Id { get; set; } usará o gerador de tipo para ObjectId e será parecido com _id: ObjectId("57ade20771e59f422cc652d9") .

public Guid _id { get; set; } usará o gerador Guid para produzir algo como "_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==") .

public int Id { get; set; } , public string id { get; set; } , public byte[] _id { get; set; } também serão colunas de índice usando os padrões para cada tipo, se não forem especificados.

2) [BsonId] oferece a flexibilidade de nomear esse índice da maneira que desejar. [BsonId] public Guid SmthElseOtherThanId { get; set; } e [BsonId] public string StringId { get; set; } serão índices; public Guid SmthElseOtherThanId { get; set; } e public string StringId { get; set; } não vai. mongodb ainda usará _id internamente.

Mesma lógica, public ObjectId SmthElseOtherThanId {get; set;} sem [BsonId] decoração não será uma coluna de índice.

3) [BsonRepresentation] permite fazer malabarismos com o tipo Mongo versus o tipo .Net interno, se houver uma conversão entre eles .

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

Tendo [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } é diferente no entanto. O Mongo irá gerar automaticamente ids de objetos por si mesmo, porém você poderá usar strings em .net, filtrar consultas etc., pois há uma conversão entre id de objeto e string.

Tendo [BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; } ou [BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; } falhará com um ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer mensagem.

Mas [BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; } vai ficar bem.