No estaba muy lejos de la solución completa con el marco de agregación:necesitaba una cosa más antes del $group
paso y eso es algo que le permitiría ver si todas las cosas que se están utilizando coinciden con algo que se posee.
Aquí está la canalización completa
> 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}})
y su salida en su documento
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
Explicación:una vez que desenvuelva ambas matrices, ahora desea marcar los elementos donde el elemento usado es igual al elemento propio y darles una "puntuación" distinta de 0. Ahora, cuando reagrupa las cosas por houseId, puede verificar si algún artículo usado no obtuvo una coincidencia. Usar 1 y 0 para el puntaje le permite hacer una suma y ahora una coincidencia para el elemento que tiene una suma 0 significa que se usó pero no coincidió con nada en "propiedad". ¡Espero que hayas disfrutado esto!