Narazil jsem na podobný problém. Chtěl jsem upsert dokumentů pomocí oficiálního ovladače C#. Měl jsem takovou třídu:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
V konzoli bych napsal:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
a fungovalo by to. V C# jsem napsal:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
a nefungovalo to! Protože ovladač obsahuje prázdné id v příkazu aktualizace a když vložím druhý dokument s jinou hodnotou výjimky Field1 E11000 duplicate key error index
je vyvoláno (v tomto případě se Mongo pokusí vložit dokument s _id, který již v db existuje).
Když jsem vygeneroval _id sám (jako začátek tématu), narazil jsem na stejnou výjimku (mongo cannot change _id of a document
) při vkládání objektů s existující hodnotou Pole1.
Řešení je označit vlastnost Id atributem [BsonIgnoreIfDefault]
(a neinicializovat jej). V tomto případě ovladač vynechá pole _id v příkazu aktualizace a MongoDb v případě potřeby vygeneruje Id.