MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Différence entre la décoration d'une propriété en C# avec BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId

1) Si vous avez une colonne nommée Id, id or _id , dans votre TDocument fortement typé class (le type d'élément dans une collection), puis une colonne nommée "_id" sera généré en Mongo. Il créera également un index pour cette colonne. Vous obtenez une duplicate key error exception si vous essayez d'insérer un élément avec une clé qui existe déjà.

public ObjectId Id { get; set; } utilisera le générateur de type pour ObjectId et il ressemblera à _id: ObjectId("57ade20771e59f422cc652d9") .

public Guid _id { get; set; } utilisera le générateur Guid pour produire quelque chose comme "_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==") .

public int Id { get; set; } , public string id { get; set; } , public byte[] _id { get; set; } seront également des colonnes d'index utilisant les valeurs par défaut pour chaque type si elles ne sont pas spécifiées.

2) [BsonId] vous donne la possibilité de nommer cet index comme vous le souhaitez. [BsonId] public Guid SmthElseOtherThanId { get; set; } et [BsonId] public string StringId { get; set; } seront des index ; public Guid SmthElseOtherThanId { get; set; } et public string StringId { get; set; } ne le fera pas. mongodb utilisera toujours _id en interne.

Même logique, public ObjectId SmthElseOtherThanId {get; set;} sans [BsonId] la décoration ne sera pas une colonne d'index.

3) [BsonRepresentation] vous permet de jongler entre le type Mongo et le type interne .Net, s'il y a une conversion entre eux .

Ayant [BsonId] [BsonRepresentation(BsonType.ObjectId)] public ObjectId Id { get; set; } est identique à public ObjectId Id { get; set; } .

Avoir [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } est cependant différent. Mongo générera automatiquement les identifiants d'objet par lui-même, mais vous pourrez utiliser des chaînes dans .net, filtrer les requêtes, etc., car il y a une conversion entre l'identifiant d'objet et la chaîne.

Avoir [BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; } ou [BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; } échouera avec un ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer message.

Mais [BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; } ira très bien.