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

ale*_*nst 5 mongodb aggregation-framework

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

这工作正常并返回所有带有额外字段的文档,一个包含 0 或 1 个元素(一个对象)的数组。如果为 0 个元素,则表示JOIN(在 SQL 世界中)没有返回任何内容。如果为 1 个元素,则表示存在匹配且该元素在具有第二个集合的字段的对象中。

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

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

为什么会这样?我怎么能$unwind然后$match所有我从$lookup舞台上得到的文件?

pro*_*r79 6

假设我们有以下文件lookup

{doc:{_id:1, lookupArray:[{doc:1},{doc:2}]}}
Run Code Online (Sandbox Code Playgroud)

{doc:{_id:2, lookupArray:[/* empty */]}}
Run Code Online (Sandbox Code Playgroud)

当我们$unwind没有任何选择时,我们将得到:

  1. {doc:{_id:1,lookupArray:{doc:1}}}
  2. {doc:{_id:1,lookupArray:{doc:2}}}
  3. 空值

当我们指定

 { $unwind: { path: "$array", preserveNullAndEmptyArrays: true } }
Run Code Online (Sandbox Code Playgroud)

然后我们会得到:

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

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

   {$match:{'lookupArray.doc':2}}
Run Code Online (Sandbox Code Playgroud)

欢迎任何意见!