如何查询子数组中的条目与所有条件匹配的文档?

时间:2017-03-02 10:00:44

标签: javascript node.js mongodb express

以下是我的角色和责任收集文件

[{
    "_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已获得读取权限

2 个答案:

答案 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' } } }  ] }

如上所述更改条件。