Ik ben een soortgelijk probleem tegengekomen. Ik wilde documenten opwaarderen met het officiële C#-stuurprogramma. Ik had een les als deze:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
In console zou ik schrijven:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
en het zou werken. In C# schreef ik:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
en het werkte niet! Omdat het stuurprogramma een lege id in de update-instructie opneemt en wanneer ik het tweede document met een andere waarde van Field1-uitzondering invoeg E11000 duplicate key error index
wordt gegooid (in dit geval probeert Mongo een document in te voegen met _id dat al bestaat in db).
Toen ik zelf _id genereerde (zoals topic starter) ben ik dezelfde uitzondering tegengekomen (mongo cannot change _id of a document
) bij het opwaarderen van objecten met de bestaande waarde van Veld1.
Oplossing is om Id-eigenschap te markeren met attribuut [BsonIgnoreIfDefault]
(en niet initialiseren). In dit geval laat het stuurprogramma het veld _id weg in de update-instructie en genereert MongoDb indien nodig een Id.