MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Upserting no Mongo DB e o problema de Id


Eu encontrei um problema semelhante. Eu queria upsert de documentos usando o driver C# oficial. Tive uma aula assim:
public class MyClass
{
    public ObjectId Id { get; set; }
    public int Field1 { get; set; }
    public string Field2 { get; set; }
}

No console eu escreveria:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"}) e funcionaria. Em C# eu escrevi:
collection.Update(Query.EQ("Field1", 3),
                Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
                UpdateFlags.Upsert);

e não funcionou! Porque o driver inclui id vazio na instrução de atualização e quando eu upsert segundo documento com valor diferente da exceção Field1 E11000 duplicate key error index é lançado (neste caso o Mongo tenta inserir um documento com _id que já existe no db).

Quando gerei _id por mim mesmo (como iniciador de tópicos), encontrei a mesma exceção (mongo cannot change _id of a document ) em objetos de upsert com valor existente de Field1.

Solução é marcar a propriedade Id pelo atributo [BsonIgnoreIfDefault] (e não inicializá-lo). Nesse caso, o driver omite o campo _id na instrução de atualização e o MongoDb gera Id, se necessário.