mongodb - 在 mongoDb 中过滤查询嵌入式文档数组(3 级)

标签 mongodb aggregation-framework

我有一组图表。每个图都有几个 block 。每个 block 都有几个端口,它本身有多个对象作为字段。 到目前为止我只能申请$filter$group在 block 上达到 1 级。我无法根据某些条件过滤到端口。

文档结构为:图表

[
  {
    "_id": "1",
    "blocks": [
      {
        "port": [
          {
            "portType": {
              "function": "input"
            }
          }
        ]
      }
    ]
  }
]

我想要实现的是获取所有具有 input 的端口的列表作为portType.function来自收藏

db.collection.aggregate([{$project:{"blocks.ports":{$filter:{input:"$blocks.ports",as:"ports",cond:{$in:["input","$$ports.portType.function"]}}}}}]);

预期输出:list<Ports>只有 portType.function作为输入。

实际输出:返回至少有一个端口作为“输入”的所有文档以及所有其他端口。

最佳答案

如果你想要一个 Port 对象的列表,你应该使用双 $unwind 阶段,然后 $match 用于 blocks.port .portType.function 最后使用 $project 阶段仅提取端口

db.collection.aggregate([
  {
    "$unwind": "$blocks"
  },
  {
    "$unwind": "$blocks.port"
  },
  {
    "$match": {
      "blocks.port.portType.function": "input"
    }
  },
  {
    $project: {
      _id: 0,
      portType: "$blocks.port.portType",
    }
  }
])

如果您的 Port 对象包含您想要提取的其他字段,例如 Foo,您只需将这些字段添加到 $project阶段类似

$project: {
    _id: 0,
    portType: "$blocks.port.portType",
    foo: "$blocks.port.foo"
    ...
}

关于mongodb - 在 mongoDb 中过滤查询嵌入式文档数组(3 级),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56785219/

相关文章:

javascript - 使用 mongoDB 和 mongoose 获取附近的地点

mongodb - Perl MongoDB::Collection 聚合函数的使用示例

mongodb - Mongo 查询查找与特定数组键值匹配的字段

MongoDB 删除或限制字段条件聚合

mongodb - 我们什么时候应该使用聚合管道mongodb?

mongodb - 如何在 mongodb $group 之后使用新键将数据再次分组到单个对象中?

javascript - 如何在 MongoDB 中更新多个对象但使用相同的数据?

MongoDB:如何找出数组字段是否包含元素?

mongodb - 计算日期在日期范围内的记录数?

mongodb - 如何将数据从 Mongodb 流式传输到 Hadoop