MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Unterschied zwischen dem Dekorieren einer Eigenschaft in C# mit BsonRepresentation(BsonType.ObjectId) vs. BsonId vs. ObjectId

1) Wenn Sie eine Spalte namens Id, id or _id haben , in Ihrem stark typisierten TDocument class (der Elementtyp in einer Sammlung), dann eine Spalte mit dem Namen "_id" wird in Mongo generiert. Es wird auch einen Index für diese Spalte erstellen. Sie erhalten einen duplicate key error Ausnahme, wenn versucht wird, ein Element mit einem bereits vorhandenen Schlüssel einzufügen.

public ObjectId Id { get; set; } verwendet den Typgenerator für ObjectId und es sieht so aus:_id: ObjectId("57ade20771e59f422cc652d9") .

public Guid _id { get; set; } verwendet den Guid-Generator, um etwas wie "_id" : BinData(3,"s2Td7qdghkywlfMSWMPzaA==") zu erzeugen .

public int Id { get; set; } , public string id { get; set; } , public byte[] _id { get; set; } werden auch Indexspalten sein, die die Standardwerte für jeden Typ verwenden, falls nicht angegeben.

2) [BsonId] gibt Ihnen die Flexibilität, diesen Index beliebig zu benennen. [BsonId] public Guid SmthElseOtherThanId { get; set; } und [BsonId] public string StringId { get; set; } werden Indizes sein; public Guid SmthElseOtherThanId { get; set; } und public string StringId { get; set; } Gewohnheit. mongodb wird weiterhin _id verwenden intern.

Gleiche Logik, public ObjectId SmthElseOtherThanId {get; set;} ohne [BsonId] Dekoration wird keine Indexspalte sein.

3) [BsonRepresentation] können Sie zwischen dem Mongo-Typ und dem internen .Net-Typ jonglieren, wenn es eine Konvertierung zwischen ihnen gibt .

Mit [BsonId] [BsonRepresentation(BsonType.ObjectId)] public ObjectId Id { get; set; } ist identisch mit public ObjectId Id { get; set; } .

Mit [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } ist aber anders. Mongo generiert Objekt-IDs automatisch selbst, Sie können jedoch Zeichenfolgen in .net verwenden, Abfragen filtern usw., da eine Konvertierung zwischen Objekt-ID und Zeichenfolge erfolgt.

Mit [BsonId] [BsonRepresentation(BsonType.ObjectId)] public byte[] Id { get; set; } oder [BsonId] [BsonRepresentation(BsonType.ObjectId)] public int Id { get; set; } schlägt fehl, wenn ObjectId not a valid representation for a ByteArraySerializer / Int32Serializer ist Nachricht.

Aber [BsonId] [BsonRepresentation(BsonType.String)] public int StringId { get; set; } wird gut.