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!