我有一组图表。每个图都有几个块。每个块都有几个端口,它们本身具有多个对象作为字段。
到目前为止,我只能在块上应用$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
作为输入。
实际输出:返回所有至少具有一个端口作为“输入”的文档以及所有其他端口。
答案 0 :(得分:0)
答案 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