MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Ajouter Unique uniquement au tableau et conserver le nombre de champs lors de la mise à jour

Pour ce type d'opération, vous ne devez pas utiliser $addToSet puisque bien sûr le $inc se produirait indépendamment du fait que quelque chose ait été ajouté au tableau ( "set" ) ou non.

Au lieu de cela, testez les tableaux avec le $ne opérateur dans la requête :

db.collection.update(
    { "unique_array": { "$ne": 18 } },    <-- existing element
    { 
        "$push": { "unique_array": 18 },
        "$inc": { "size_of_array": 1 }
    }
)

Il en va de même pour la suppression des membres du tableau, mais bien sûr cette fois, vous testez la présence avec égalité :

db.collection.update(
    { "unique_array": 18 },    <-- existing element
    { 
        "$pull": { "unique_array": 18 },
        "$inc": { "size_of_array": -1 }
    }
)

Étant donné que la condition de requête doit correspondre, si l'élément de tableau était déjà présent lors de l'ajout, il n'y a pas de correspondance et pas de $push ou $inc les opérations sont exécutées. Et il en va de même pour le $pull cas où l'élément n'est pas présent dans le tableau.