MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Usa l'aggregazione MongoDB per trovare l'intersezione di due insiemi all'interno dello stesso documento

Non eri molto lontano dalla soluzione completa con framework di aggregazione:avevi bisogno di un'altra cosa prima del $group passo e questo è qualcosa che ti permetterebbe di vedere se tutte le cose che vengono utilizzate corrispondono a qualcosa che è di proprietà.

Ecco la pipeline completa

> 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}})

e il suo output sul tuo documento

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

Spiegazione - una volta scartati entrambi gli array, ora si desidera contrassegnare gli elementi in cui l'oggetto utilizzato è uguale all'oggetto di proprietà e assegnare loro un "punteggio" diverso da 0. Ora, quando raggruppi le cose per houseId, puoi controllare se gli oggetti usati non hanno trovato una corrispondenza. L'uso di 1 e 0 per il punteggio ti consente di fare una somma e ora una corrispondenza per l'elemento che ha somma 0 significa che è stato utilizzato ma non corrisponde a nulla in "posseduto". Spero ti sia piaciuto!