在MongoDB中使用$ lookup后使用$ match

时间:2016-07-12 12:40:30

标签: mongodb aggregation-framework

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

假设我们在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}}}
  3. 当我们指定

     { $unwind: { path: "$array", preserveNullAndEmptyArrays: true } }
    
    然后我们会得到:

    1. {doc:{_ id:1,lookupArray:{doc:1}}}
    2. {doc:{_ id:1,lookupArray:{doc:2}}}
    3. {doc:{_ id:2,lookupArray:[/ * empty * /]}}
    4. 因此,当您想从lookupArray搜索值doc时,$match将如下所示:

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

      欢迎任何评论!