Не бяхте много далеч от пълното решение с рамка за агрегиране - имахте нужда от още нещо преди $group
стъпка и това е нещо, което ще ви позволи да видите дали всички неща, които се използват, съвпадат с нещо, което е собственост.
Ето пълния конвейер
> 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}})
и извеждането му във вашия документ
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
Обяснение - след като разопаковате двата масива, сега искате да маркирате елементите, където използваният елемент е равен на притежавания елемент и да им дадете не-0 "резултат". Сега, когато прегрупирате нещата обратно по houseId, можете да проверите дали някои използвани артикули не са съвпаднали. Използването на 1 и 0 за резултат ви позволява да направите сума и сега съвпадение за елемент, който има сума 0, означава, че е бил използван, но не съответства на нищо в „притежаван“. Надявам се това да ви е харесало!