如何在MongoDB中过滤聚合元素?
在官方的mongo文档中,有一个示例演示了如何在MongoDB中过滤聚合元素?,mongodb,Mongodb,在官方的mongo文档中,有一个示例演示了$graphLookup,该示例在每个结果元素中包含reportingHierarchy字段。但如何过滤某些关键帧内设置的最终元素 { "_id": 1, "name": "Dev", final: false } { "_id": 2, "name": "Eliot", "reportsTo" : "Dev", final: false } { "_id": 3, "name": "Ron", "reportsTo" : "Eliot", final:
$graphLookup
,该示例在每个结果元素中包含reportingHierarchy
字段。但如何过滤某些关键帧内设置的最终元素
{ "_id": 1, "name": "Dev", final: false }
{ "_id": 2, "name": "Eliot", "reportsTo" : "Dev", final: false }
{ "_id": 3, "name": "Ron", "reportsTo" : "Eliot", final: false }
{ "_id": 4, "name": "Andrew", "reportsTo" : "Eliot", final: false }
{ "_id": 5, "name": "Asya", "reportsTo" : "Ron", final: true }
{ "_id": 6, "name": "Dan", "reportsTo" : "Andrew", final: true }
我需要向这个查询添加什么,以确定我只对带有final:true
param的记录感兴趣,但仍然获得所有reportingHierarchy
树
db.employees.aggregate( [
???
{
$graphLookup: {
from: "employees",
startWith: "$reportsTo",
connectFromField: "reportsTo",
connectToField: "name",
as: "reportingHierarchy"
}
}
] )
预期产出:
{ "_id": 5, "name": "Asya", "reportsTo" : "Ron", final: true,
"reportingHierarchy": [
{ "_id": 1, "name": "Dev", final: false },
{ "_id": 2, "name": "Eliot", "reportsTo" : "Dev", final: false },
{ "_id": 3, "name": "Ron", "reportsTo" : "Eliot", final: false }
]
}
{ "_id": 6, "name": "Dan", "reportsTo" : "Andrew", final: true,
"reportingHierarchy": [
{ "_id": 1, "name": "Dev", final: false },
{ "_id": 2, "name": "Eliot", "reportsTo" : "Dev", final: false },
{ "_id": 4, "name": "Andrew", "reportsTo" : "Eliot", final: false }
]
}
首先使用
$match
筛选出所需的记录
db.employees.aggregate([
{
$match: { final: true }
},
{
$graphLookup: {
from: "employees",
startWith: "$reportsTo",
connectFromField: "reportsTo",
connectToField: "name",
as: "reportingHierarchy"
}
}
])
你可以试试这个
db.employees.aggregate([{
$match: {
"final": true
}
}, {
$graphLookup: {
from: "employees",
startWith: "$reportsTo",
connectFromField: "reportsTo",
connectToField: "name",
as: "reportingHierarchy"
}
}, {
$addFields: {
reportingHierarchy: {
$filter: {
input: "$reportingHierarchy",
as: "reportingHierarchy_field",
cond: {
$and: [{
$eq: ["$$reportingHierarchy_field.final", true]
}
]
}
}
},
}
}
])
你能分享你的预期产出吗?我找到了一个选择,就是这样做。只要查询只是一个过滤器链,我们就可以过滤
$graphLookup
结果,就像这样:{$match:{“final”:true}}
不知道它对不对,因为我们没有隔离初始集。@MuhammadFaizan,我刚刚更新了我的问题。这应该行得通。你为什么只在一个查询中使用$和。@MuhammadFaizan哦,是的,你是对的,这是我的错误。对此表示抱歉。