Anda tidak jauh dari solusi lengkap dengan kerangka kerja agregasi - Anda memerlukan satu hal lagi sebelum $group
langkah dan itu adalah sesuatu yang akan memungkinkan Anda untuk melihat apakah semua hal yang digunakan cocok dengan sesuatu yang dimiliki.
Berikut alur lengkapnya
> 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}})
dan hasilnya pada dokumen Anda
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
Penjelasan - setelah Anda membuka kedua array, Anda sekarang ingin menandai elemen di mana item yang digunakan sama dengan item yang dimiliki dan memberi mereka "skor" non-0. Sekarang ketika Anda mengelompokkan kembali barang-barang dengan houseId, Anda dapat memeriksa apakah ada barang bekas yang tidak cocok. Menggunakan 1 dan 0 untuk skor memungkinkan Anda melakukan penjumlahan dan sekarang kecocokan untuk item yang memiliki jumlah 0 berarti telah digunakan tetapi tidak cocok dengan apa pun di "dimiliki". Semoga Anda menikmati ini!