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.