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.