mongoDB根据条件从其他集合的链接文档中获取具有值的文档

时间:2019-06-18 12:22:47

标签: mongodb aggregation-framework

我有以下结构的集合:

对象:

[{"type": "someTypeOne", "menuId": 1},
{"type": "someTypeTwo", "menuId": 1},
{"type": "someTypeOne", "menuId": 2}]

菜单:

[{"id":1, "type": "someTypeOne"},
{"id":2, "type": "someTypeOne"}]

我需要找到“类型”属性与其菜单“类型”不匹配的所有对象。在这种情况下,所需的输出将是:

[{"type": "someTypeTwo", "menuId": 1}]

我认为我应该对此使用聚合,但目前我对此不太满意,但到目前为止我还无法制定一个有效的查询。 谢谢

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

$expr