我有一个集合,其中包含以下两个相关字段。
{
currentStage: ObjectId("5b06999d889de3bd613ab79d"),
stagePermissions: [
{
"stage" : ObjectId("5b06999d889de3bd613ab79d"),
"_id" : ObjectId("5b3ca6ed676af0e70150a7b9"),
"permissions" : [
"admin"
]
},
{
"stage" : ObjectId("587d33db87969c1b380fb903"),
"_id" : ObjectId("5b3ca6ed676af0e70150a7b8"),
"permissions" : [
"admin"
]
},
]
}
我需要查询的是获取对“ admin”具有当前阶段权限的文档。
所以我需要匹配"stagePermissions.permissions": "admin"
。但是问题是stagePermissions具有所有阶段的权限。我只需要将currentStage
与stagePermissions.permissions
匹配。
换句话说,我要执行的操作是因为我没有currentStage的ID作为过滤器,因此只能使用“ admin”进行过滤。
"stagePermissions.stage": "document's currentStage" AND "stagePermissions": "admin"
预期输出:
在currentStage
中将其stagePermissions
权限设置为“ admin”的所有文档。
答案 0 :(得分:1)
您可以尝试以下汇总
db.collection.aggregate([
{
"$project": {
"stagePermissions": {
"$filter": {
"input": "$stagePermissions",
"as": "stagePermission",
"cond": {
"$and": [
{
"$eq": [
"$$stagePermission.stage",
"$currentStage"
]
},
{
"$in": [
"admin",
"$$stagePermission.permissions"
]
}
]
}
}
},
"currentStage": 1
}
},
{
"$match": {
"stagePermissions": {
"$ne": []
}
}
}
])
尝试here