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

Upserting in Mongo DB und das ID-Problem

Ich bin auf ein ähnliches Problem gestoßen. Ich wollte Dokumente mit dem offiziellen C#-Treiber einfügen. Ich hatte eine Klasse wie diese:

public class MyClass
{
    public ObjectId Id { get; set; }
    public int Field1 { get; set; }
    public string Field2 { get; set; }
}

In der Konsole würde ich schreiben:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"}) und es würde funktionieren. In C# schrieb ich:

collection.Update(Query.EQ("Field1", 3),
                Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
                UpdateFlags.Upsert);

und es hat nicht funktioniert! Da der Treiber eine leere ID in der Update-Anweisung enthält und wenn ich das zweite Dokument mit einem anderen Wert der Field1-Ausnahme E11000 duplicate key error index einfüge wird ausgelöst (in diesem Fall versucht Mongo, ein Dokument mit _id einzufügen, das bereits in db existiert).

Als ich _id selbst generiert habe (wie Themenstarter), bin ich auf dieselbe Ausnahme gestoßen (mongo cannot change _id of a document ) beim Upserting von Objekten mit dem vorhandenen Wert von Field1.

Lösung ist, die ID-Eigenschaft durch das Attribut [BsonIgnoreIfDefault] zu markieren (und nicht initialisieren). In diesem Fall lässt der Treiber das Feld _id in der Update-Anweisung aus und MongoDb generiert bei Bedarf eine ID.