Me encontré con un problema similar. Quería alterar documentos usando el controlador oficial de C#. Tuve una clase como esta:
public class MyClass
{
public ObjectId Id { get; set; }
public int Field1 { get; set; }
public string Field2 { get; set; }
}
En la consola escribiría:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"})
y funcionaria En C# escribí:
collection.Update(Query.EQ("Field1", 3),
Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
UpdateFlags.Upsert);
¡y no funcionó! Debido a que el controlador incluye una identificación vacía en la declaración de actualización y cuando modifico el segundo documento con un valor diferente de la excepción Field1 E11000 duplicate key error index
se lanza (en este caso, Mongo intenta insertar un documento con _id que ya existe en db).
Cuando generé _id por mí mismo (como iniciador de tema) me encontré con la misma excepción (mongo cannot change _id of a document
) al alterar objetos con el valor existente de Field1.
Solución es marcar la propiedad Id por el atributo [BsonIgnoreIfDefault]
(y no inicializarlo). En este caso, el controlador omite el campo _id en la declaración de actualización y MongoDb genera una identificación si es necesario.