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

时间:2019-06-27 06:35:07

标签: mongodb aggregation-framework

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

文档结构为:图

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

我想要实现的是从集合中获取所有inputportType.function的端口的列表

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

预期的输出:list<Ports>,仅以portType.function作为输入。

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

2 个答案:

答案 0 :(得分:0)

您可以简单地使用两个120阶段来平整数组,然后使用CInt阶段,如下所示:

$unwind

结果:

$match

在线试用:mongoplayground.net/p/TOUCkCOSE7D

答案 1 :(得分:0)

如果您想要Port对象的列表,则应使用双$unwind阶段,然后将$match用于blocks.port.portType.function,最后使用{{1}仅提取端口}阶段

$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