MongoDB中的嵌入式文档阵列(3个级别)上的过滤查询



我有一个图表。每个图都有几个块。每个块都有多个端口,它们本身具有多个对象作为字段。到目前为止,我只能将$filter$group应用于块上的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对象列表,则应使用Double $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"
    ...
}

您可以简单地使用两个 $unwind阶段来弄平数组,然后使用这样的 $match阶段:

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

结果:

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

在线尝试:mongoplayground.net/p/touckcose7d

最新更新