以下是我的角色和责任收集文件
[{
"_id": {
"$oid": "58b6c380734d1d48176c9e69"
},
"role": "Admin",
"resource": [
{
"id": "blog",
"permissions": [
"read",
"update",
"delete"
]
},
{
"id": "user",
"permissions": [
"create",
"read",
"update",
"delete"
]
},
{
"id": "journal",
"permissions": [
"create",
"read",
"update",
"delete"
]
}
]
},
{
"_id": {
"$oid": "58b7db3cf36d285019ea175f"
},
"role": "Manager",
"resource": [
{
"id": "blog",
"permissions": [
"read",
"update",
"delete"
]
},
{
"id": "user",
"permissions": [
"create",
"read",
"update",
"delete"
]
},
{
"id": "journal",
"permissions": [
"create",
"read",
"update",
"delete"
]
}
]
}]
我想检查管理员是否有创建访问权限。 我写了这样的查询
var check = { $and: [ { 'role':req.body.role, }, { 'resource.id':'blog'},{'resource.permissions':'create'} ] }
Rolesandresponsibilitie.find(check).populate('user', 'displayName').exec(function(err, rolesandresponsibilities) {
if (err) return next(err);
if (! rolesandresponsibilities) return res.status(404).send('Not Found'); };
return res.status(200).send('Found'); }
});
我未定义
我的期望:
例如1:
role = Admin
id = blog
permissions = create
我应该得到响应Not Found,因为Admin只有
“权限”:[ “读”, “更新”, “删除” ]
以上3个权限
示例2:
role = Admin
id = blog
permissions = read
我应该得到回复,因为Admin已获得读取权限
答案 0 :(得分:2)
$ elemMatch是您需要的,它将简化查询。 默认情况下,mongo会将查询中的属性视为$和语句,因此无需在此处添加。
更简单的查询是
var check = {
'role':req.body.role,
'resource':{
'$elemMatch': {
'id': 'blog',
'permissions': 'create'
}
}
}
Rolesandresponsibilitie.find(check).populate('user', 'displayName').exec(function(err, rolesandresponsibilities) {
if (err) return next(err);
if (! rolesandresponsibilities) return res.status(404).send('Not Found'); };
return res.status(200).send('Found'); }
});
您当前遇到的问题是因为查询
'resource.id':blog and 'resource.permissions':create
是数组中的元素与两个过滤器匹配。 它只是检查资源数组是否有id = blog,如果某些东西有权限=创建,结果不一定必须是数组中的相同条目。
祝你好运!
答案 1 :(得分:1)
如果要查询子文档数组,并且想要按子文档放置条件,则需要使用$ elemMatch。
var check = { $and: [ { 'role':req.body.role, }, { resource: { $elemMatch: { 'id': 'blog', 'permissions': 'create' } } } ] }
如上所述更改条件。