【发布时间】:2016-03-17 18:34:09
【问题描述】:
我实际上是在尝试发出一个 mongodb 请求,该请求首先在一个列表中填充过滤器,然后在另一个列表中。
说明
我的数据库中有以下对象:
{
"_id": ObjectId("..."),
"title": "MySuperProject",
"files": [
{
"title":"My skiing day !",
"right":[{
"role":"USER",
"access":["read"]
}]
},
{
"title":"My little dog, so cute !",
"right":[{
"role":"OTHER",
"access":["read"]
}]
}
],
"people": [
{
"userName":"borat",
"role":"OTHERONE",
"right":[{
"role":"USER",
"access":["read"]
}]
},
{
"userName":"Thomas",
"role":"OTHER",
"right":[{
"role":"OTHER",
"access":["read"]
}]
}
]
}
我需要什么
我需要将一个参数传递给我的函数,即当前用户角色。就我而言,我传递了“USER”角色。
这样,我需要检索这个结果:
{
"_id": ObjectId("..."),
"title": "MySuperProject",
"files": [
{
"title":"My skiing day !",
"right":[{
"role":"USER",
"access":["read"]
}]
}
],
"people": [
{
"userName":"borat",
"role":"OTHER",
"right":[{
"role":"USER",
"access":["read"]
}]
}
]
}
这减少了与我匹配的项目角色上的两个列表。
我有什么
我有一个通过“角色”属性减少文件列表的查询。
事实上,在我的人员列表中,我有两次角色属性:
- 一次性确定人员角色
- 一次性确定哪些人可以访问(正确访问)人员资料
我的查询通过匹配遇到的第一个角色(people.role 而不是 people.right.role)来减少人员结果集。
我的查询如下:
db.t.aggregate([
{
$match: {
"title": projectTitle
}
},
{
$redact: {
$cond: [{
$eq: [role, {
$ifNull: ["$role", role]
}]
}, "$$DESCEND", "$$PRUNE"]
}
},
{
$redact: {
$cond: [{
$gt: [{
$size: {
$ifNull: ["$right", [1]]
}
}, 0]
}, "$$DESCEND", "$$PRUNE"]
}
},
])
总结:我需要查询减少人员和匹配两个 right.role 值的文件列表
【问题讨论】:
标签: node.js mongodb mongodb-query aggregation-framework