Du var ikke meget langt fra den fulde løsning med aggregeringsramme - du havde brug for en ting mere før $group
trin, og det er noget, der giver dig mulighed for at se, om alle de ting, der bliver brugt, stemmer overens med noget, der er ejet.
Her er den fulde pipeline
> 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}})
og dets output på dit dokument
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
Forklaring - når du først udpakker begge arrays, vil du nu markere de elementer, hvor brugt vare er lig med ejet vare og give dem en ikke-0 "score". Nu, når du omgrupperer tingene efter houseId, kan du tjekke, om nogen brugte varer ikke matchede. Brug af 1 og 0 til score giver dig mulighed for at lave en sum, og nu betyder et match for element, som har sum 0, at det blev brugt, men ikke matchede noget i "ejet". Håber du nød dette!