Du var inte särskilt långt ifrån den fullständiga lösningen med aggregeringsramverk - du behövde en sak till innan $group
steg och det är något som gör att du kan se om alla saker som används stämmer överens med något som ägs.
Här är hela pipelinen
> 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}})
och dess utdata på ditt dokument
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
Förklaring - när du väl har packat upp båda arrayerna vill du nu flagga elementen där använd objekt är lika med ägt objekt och ge dem en icke-0 "poäng". Nu när du grupperar tillbaka saker efter houseId kan du kontrollera om några använda föremål inte matchade. Genom att använda 1 och 0 för poäng kan du göra en summa och nu betyder en matchning för objekt som har summa 0 att det användes men inte matchade något i "ägd". Hoppas du gillade detta!