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

Como determinar se $addToSet realmente adicionou um novo item em um documento do MongoDB ou se o item já existia?


É claro que o que você está fazendo aqui é realmente verificar a resposta que indica se um documento foi atualizado ou inserido ou, de fato, se nenhuma operação ocorreu. Esse é o seu melhor indicador para um $addToSet ter realizado uma atualização, o documento seria atualizado.

O $addToSet operador em si não pode produzir duplicatas, essa é a natureza do operador. Mas você pode realmente ter alguns problemas com sua lógica:
{                                                
      "$addToSet", new BsonDocument()
           {
                { "items", new BsonDocument()
                     {
                          { "id", item.Id },
                          { "v", item.Value } 
                     }
                }
           }
 }

Então, claramente, você está mostrando que um item em seu "conjunto" é composto de dois campos, portanto, se esse conteúdo variar de alguma forma (ou seja, mesmo id, mas valor diferente), o item é realmente um membro "único" do conjunto e será ser adicionado. Não haveria como, por exemplo, o $addToSet operador para não adicionar novos valores puramente com base no "id" como um identificador exclusivo. Você teria que realmente rolar isso no código.

Uma segunda possibilidade aqui para uma forma de duplicata é que sua parte de consulta não está encontrando corretamente o documento que precisa ser atualizado. O resultado disso seria a criação de um novo documento que contém apenas o membro recém-especificado no "conjunto". Portanto, um erro de uso comum é algo assim:
db.collection.update(
    { 
        "id": ABC,
        "items": { "$elemMatch": {
            "id": 123, "v": 10
         }},
    {
        "$addToSet": {
            "items": {
                "id": 123, "v": 10
            }
        }
    },
    { "upsert": true }
)

O resultado desse tipo de operação sempre criaria um novo documento porque o documento existente não continha o elemento especificado no "conjunto". A implementação correta é não verifique a presença do membro "set" e permita $addToSet para fazer o trabalho.

Se de fato você tem true entradas duplicadas ocorrendo no "conjunto" onde todos os elementos do subdocumento são exatamente os mesmos, então isso foi causado por algum outro código presente ou no passado.

Quando tiver certeza de que uma nova entrada está sendo criada, procure no código por instâncias de $push ou de fato e manipulação de array em código que parece estar agindo no mesmo campo.

Mas se você estiver usando o operador corretamente então $addToSet faz exatamente o que se propõe a fazer.