我有一个图表。每个图都有几个块。每个块都有多个端口,它们本身具有多个对象作为字段。到目前为止,我只能将$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