Nebyli jste příliš daleko od úplného řešení s agregačním rámcem - před $group
jste potřebovali ještě jednu věc krok a to je něco, co by vám umožnilo zjistit, zda všechny věci, které se používají, odpovídají něčemu, co je vlastněno.
Zde je úplný seznam
> 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}})
a jeho výstup ve vašem dokumentu
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
Vysvětlení – jakmile rozbalíte obě pole, nyní chcete označit prvky, kde se použitá položka rovná vlastněné položce, a dát jim „skóre“ jiné než 0. Nyní, když přeskupíte věci zpět podle houseId, můžete zkontrolovat, zda se některé použité položky neshodovaly. Použití 1 a 0 pro skóre vám umožňuje provést součet a nyní shoda pro položku, která má součet 0, znamená, že byla použita, ale neodpovídala ničemu v "vlastněno". Doufám, že se vám to líbilo!