J'ai rencontré un problème similaire. Je voulais mettre à jour des documents à l'aide du pilote C# officiel. J'ai eu un cours comme celui-ci :
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
Dans la console, j'écrirais :db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
et ça marcherait. En C# j'ai écrit :
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
et ça n'a pas marché ! Parce que le pilote inclut un identifiant vide dans l'instruction de mise à jour et lorsque je mets à jour le deuxième document avec une valeur différente de l'exception Field1 E11000 duplicate key error index
est lancé (dans ce cas, Mongo essaie d'insérer un document avec _id qui existe déjà dans la base de données).
Lorsque j'ai généré _id par moi-même (comme le démarreur de sujet), j'ai rencontré la même exception (mongo cannot change _id of a document
) lors de la mise en place d'objets avec la valeur existante de Field1.
Solution est de marquer la propriété Id par l'attribut [BsonIgnoreIfDefault]
(et ne pas l'initialiser). Dans ce cas, le pilote omet le champ _id dans l'instruction de mise à jour et MongoDb génère un identifiant si nécessaire.