アグリゲーションフレームワークを使用した完全なソリューションからそれほど遠くはありませんでした。$group
の前にもう1つ必要なものがありました。 ステップとそれは、使用されているすべてのものが所有されているものと一致するかどうかを確認できるようにするものです。
これが完全なパイプラインです
> 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}})
およびドキュメントへの出力
{
"result" : [
{
"_id" : {
"house" : 123,
"item" : "sofa"
},
"hasWhatHeUses" : 0
}
],
"ok" : 1
}
説明-両方の配列をアンラップしたら、使用済みアイテムが所有アイテムと等しい要素にフラグを付け、それらに0以外の「スコア」を付けます。これで、houseIdで物事を再グループ化するときに、使用済みのアイテムが一致しなかったかどうかを確認できます。スコアに1と0を使用すると、合計を行うことができます。合計が0のアイテムとの一致は、使用されたが「所有」のアイテムと一致しなかったことを意味します。これを楽しんでいただけたでしょうか!