Ho riscontrato un problema simile. Volevo aggiornare i documenti utilizzando il driver C# ufficiale. Ho avuto una classe come questa:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
In console scriverei:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
e funzionerebbe. In C# ho scritto:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
e non ha funzionato! Perché il driver include un ID vuoto nella dichiarazione di aggiornamento e quando inserisco il secondo documento con un valore diverso dell'eccezione Field1 E11000 duplicate key error index
viene lanciato (in questo caso Mongo tenta di inserire un documento con _id che esiste già in db).
Quando ho generato _id da solo (come topic starter) ho riscontrato la stessa eccezione (mongo cannot change _id of a document
) sull'upserting di oggetti con il valore esistente di Field1.
Soluzione è contrassegnare la proprietà Id in base all'attributo [BsonIgnoreIfDefault]
(e non inizializzarlo). In questo caso il driver omette il campo _id nella dichiarazione di aggiornamento e MongoDb genera l'ID se necessario.