Nie byłeś zbyt daleko od pełnego rozwiązania z frameworkiem agregacji - potrzebowałeś jeszcze jednej rzeczy przed $group
krok i to jest coś, co pozwoliłoby ci sprawdzić, czy wszystkie używane rzeczy pasują do czegoś, co jest własnością.
Oto pełny potok
> 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}})
i jego wynik na twoim dokumencie
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
Objaśnienie - po rozpakowaniu obu tablic, teraz chcesz oznaczyć elementy, w których używany element jest równy posiadanemu elementowi i nadać im "punktację" różną od 0. Teraz, gdy przegrupujesz rzeczy z powrotem według identyfikatora domu, możesz sprawdzić, czy jakieś używane przedmioty nie pasują do siebie. Użycie 1 i 0 dla wyniku pozwala na dokonanie sumy, a teraz dopasowanie dla przedmiotu, który ma sumę 0 oznacza, że został użyty, ale nie pasuje do niczego w "posiadanych". Mam nadzieję, że Ci się podobało!