【问题标题】:Using $match after a $lookup in MongoDB在 MongoDB 中进行 $lookup 后使用 $match
【发布时间】:2016-11-14 17:08:43
【问题描述】:

我有两个集合,我想从两个集合中获取字段,所以我在聚合管道中使用$lookup

这很好用,并返回所有带有额外字段的文档,一个包含 0 或 1 个元素的数组(一个对象)。如果为 0 个元素,则意味着 JOIN(在 SQL 世界中)没有返回任何内容。如果是 1 个元素,则表示对象中的元素与第二个集合的字段匹配。

现在我有了这些结果,我想使用$match 来过滤一些结果。

为了使用$match,我首先想在那个新的额外字段上使用$unwind,以便提取数组。问题是一旦我插入$unwind 阶段,查询的结果就是一个文档。

为什么会这样?我怎样才能$unwind 然后$match 我从$lookup 阶段获得的所有文件?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    假设我们有lookup之后的文档:

    {doc:{_id:1, lookupArray:[{doc:1},{doc:2}]}}
    

    {doc:{_id:2, lookupArray:[/* empty */]}}
    

    当我们$unwind 没有任何选项时,我们会得到:

    1. {doc:{_id:1,lookupArray:{doc:1}}}
    2. {doc:{_id:1,lookupArray:{doc:2}}}

    当我们指定时

     { $unwind: { path: "$array", preserveNullAndEmptyArrays: true } }
    

    那么我们会得到:

    1. {doc:{_id:1,lookupArray:{doc:1}}}
    2. {doc:{_id:1,lookupArray:{doc:2}}}
    3. {doc:{_id:2,lookupArray:[/* 空 */]}}

    因此,当您要从 lookupArray 中搜索值 doc 时,$match 将如下所示:

       {$match:{'lookupArray.doc':2}}
    

    欢迎任何 cmets!

    【讨论】:

    • 如果我想执行$lookup 并且还想按条件过滤怎么办?所以这样我在新创建的字段上只会得到 1 个(或 0 个)结果。或者换句话说,如果我最终在新字段中有多个对象,有没有办法可以过滤该字段并只留下 doc: 2 的对象?
    • 您可以使用$project 来操作文档形状 - 如果这对您有帮助,请标记为答案 :-)
    • 别担心,我会标记你的答案。您能否进一步解释一下我将如何使用$project
    • 在新阵列上使用 $project 然后 $filter -> docs.mongodb.com/manual/reference/operator/aggregation/filter
    猜你喜欢
    • 2022-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2020-12-29
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多