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

Adicione Unique apenas ao array e mantenha a contagem de campos na atualização


Para este tipo de operação você não deve usar $addToSet já que, claro, o $inc aconteceria independentemente de algo ter sido adicionado ao array ("set" ) ou não.

Em vez disso, teste os arrays com o $ne operador na consulta:
db.collection.update(
    { "unique_array": { "$ne": 18 } },    <-- existing element
    { 
        "$push": { "unique_array": 18 },
        "$inc": { "size_of_array": 1 }
    }
)

O mesmo vale para remover membros do array, mas é claro que desta vez você testa a presença com igualdade:
db.collection.update(
    { "unique_array": 18 },    <-- existing element
    { 
        "$pull": { "unique_array": 18 },
        "$inc": { "size_of_array": -1 }
    }
)

Como a condição da consulta precisa corresponder, se o elemento da matriz já estiver presente ao adicionar, não haverá correspondência e nem $push ou $inc operações são executadas. E o mesmo vale para o $pull caso em que o elemento não está presente na matriz.