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

Utilisez l'agrégation MongoDB pour trouver l'intersection de deux ensembles dans le même document

Vous n'étiez pas très loin de la solution complète avec le framework d'agrégation - vous aviez besoin d'une chose de plus avant le $group étape et c'est quelque chose qui vous permettrait de voir si toutes les choses qui sont utilisées correspondent à quelque chose qui vous appartient.

Voici le pipeline complet

> db.house.aggregate(
       {'$unwind':'$uses'}, 
       {'$unwind':'$rooms'}, 
       {'$unwind':'$rooms.owns'}, 
       {$project:  { _id:0, 
                     houseId:1, 
                     uses:"$uses.name", 
                     isOkay:{$cond:[{$eq:["$uses.name","$rooms.owns.name"]}, 1, 0]}
                   }
       }, 
       {$group: { _id:{house:"$houseId",item:"$uses"}, 
                  hasWhatHeUses:{$sum:"$isOkay"}
                }
       },
       {$match:{hasWhatHeUses:0}})

et sa sortie sur votre document

{
    "result" : [
        {
            "_id" : {
                "house" : 123,
                "item" : "sofa"
            },
            "hasWhatHeUses" : 0
        }
    ],
    "ok" : 1
}

Explication - une fois que vous avez déballé les deux tableaux, vous voulez maintenant marquer les éléments où l'élément utilisé est égal à l'élément possédé et leur donner un "score" différent de 0. Désormais, lorsque vous regroupez des éléments par houseId, vous pouvez vérifier si des éléments utilisés n'ont pas trouvé de correspondance. L'utilisation de 1 et 0 pour le score vous permet de faire une somme et maintenant une correspondance pour un élément qui a une somme de 0 signifie qu'il a été utilisé mais ne correspond à rien dans "possédé". J'espère que cela vous a plu !