Je was niet ver verwijderd van de volledige oplossing met aggregatieraamwerk - je had nog één ding nodig voor de $group
stap en dat is iets waarmee je kunt zien of alle dingen die worden gebruikt overeenkomen met iets dat eigendom is.
Hier is de volledige pijplijn
> 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}})
en de uitvoer ervan op uw document
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
Uitleg - als je beide arrays eenmaal hebt uitgepakt, wil je nu de elementen markeren waar het gebruikte item gelijk is aan het eigendomsitem en ze een niet-0 "score" geven. Als je nu dingen hergroepeert op huis-ID, kun je controleren of gebruikte items geen overeenkomst hebben gekregen. Als u 1 en 0 gebruikt voor de score, kunt u een som maken en nu betekent een overeenkomst voor een item met som 0 dat het is gebruikt maar niet overeenkomt met iets in "eigendom". Ik hoop dat je dit leuk vond!