Você não estava muito longe da solução completa com estrutura de agregação - você precisava de mais uma coisa antes do
$group
passo e isso é algo que permite que você veja se todas as coisas que estão sendo usadas combinam com algo que é propriedade. Aqui está o pipeline completo
> 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}})
e sua saída em seu documento
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
Explicação - depois de desembrulhar ambas as matrizes, você agora deseja sinalizar os elementos em que o item usado é igual ao item de propriedade e dar a eles uma "pontuação" diferente de 0. Agora, quando você reagrupa as coisas por houseId, pode verificar se algum item usado não correspondeu. Usar 1 e 0 para pontuação permite que você faça uma soma e agora uma correspondência para item que tenha soma 0 significa que foi usado, mas não correspondeu a nada em "propriedade". Espero que você tenha gostado disso!