我有以下结构的集合:
对象:
[{"type": "someTypeOne", "menuId": 1},
{"type": "someTypeTwo", "menuId": 1},
{"type": "someTypeOne", "menuId": 2}]
菜单:
[{"id":1, "type": "someTypeOne"},
{"id":2, "type": "someTypeOne"}]
我需要找到“类型”属性与其菜单“类型”不匹配的所有对象。在这种情况下,所需的输出将是:
[{"type": "someTypeTwo", "menuId": 1}]
我认为我应该对此使用聚合,但目前我对此不太满意,但到目前为止我还无法制定一个有效的查询。 谢谢
答案 0 :(得分:2)
您可以尝试以下汇总:
db.objects.aggregate([
{
$lookup: {
from: "menus",
localField: "menuId",
foreignField: "id",
as: "menu"
}
},
{
$unwind: "$menu"
},
{
$match: {
$expr: {
$ne: [ "$menu.type", "$type" ]
}
}
},
{
$project: {
menu: 0
}
}
])
$lookup允许您从两个集合中获取数据,然后可以在menu
数组上运行$unwind以获取每个文档的单个菜单,并且可以使用{{3 }}和$match