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

标签 mongodb aggregation-framework

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

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

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

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

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

最佳答案

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

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


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

当我们$unwind没有任何选择,我们将得到:
  • {doc:{_id:1, lookupArray:{doc:1}}}
  • {doc:{_id:1, lookupArray:{doc:2}}}

  • 当我们指定
     { $unwind: { path: "$array", preserveNullAndEmptyArrays: true } }
    

    然后我们会得到:
  • {doc:{_id:1, lookupArray:{doc:1}}}
  • {doc:{_id:1, lookupArray:{doc:2}}}
  • {doc:{_id:2, lookupArray:[/* 空 */]}}

  • 因此,当您想从 lookupArray 中搜索值文档时,$match看起来像这样:
       {$match:{'lookupArray.doc':2}}
    

    欢迎任何意见!

    关于mongodb - 在 MongoDB 中执行 $lookup 后使用 $match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38329199/

    相关文章:

    java - Mongo 将 Document 转换为 DBObject

    mongodb - 如何部分更新 MongoDB 中的对象,以便新对象与现有对象重叠/合并

    javascript - async await node.js 跳过第二个 await 语句保存 mongodb

    javascript - 单链查询 mongodb/mongoose 以获取所有评论

    javascript - MongoDb:如何从文档中获取字段(子文档)?

    python - 为什么 PyMongo 3 给出 ServerSelectionTimeoutError?

    c# - 如何将字符串列表序列化为 objectid 列表

    mongodb - 从数组大小进行投影会引发未定义数组的错误

    java - 在 Spring Data Mongodb 中使用 $$ROOT 来检索整个文档

    java - Mongodb + java 在选定的日期范围内按字段对文档进行分组