sql >> Base de Datos >  >> NoSQL >> MongoDB

Upserting en Mongo DB y el problema de Id

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.