【问题标题】:How do I query documents where an entry in a sub-array matches all conditions?如何查询子数组中的条目与所有条件匹配的文档?
【发布时间】:2017-07-21 23:46:31
【问题描述】:

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

[{
    "_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:

角色 = 管理员

id = 博客

权限 = 创建

我应该得到响应 Not Found 因为管理员只有

“权限”:[ “读”, “更新”, “删除” ]

3 个以上权限

示例 2:

角色 = 管理员

id = 博客

权限 = 读取

我应该得到响应,因为管理员具有读取权限

【问题讨论】:

    标签: javascript node.js mongodb express


    【解决方案1】:

    如果要在子文档数组中查询,并且要根据每个子文档放置条件,则需要使用 $elemMatch。

    var check = { $and: [ { 'role':req.body.role, },  { resource: { $elemMatch: { 'id': 'blog', 'permissions': 'create' } } }  ] }
    

    如上所述更改条件。

    【讨论】:

      【解决方案2】:

      $elemMatch 是您所需要的,它将简化查询。 默认情况下,mongo 会将查询中的属性视为 $and 语句,因此无需在此处添加。

      一个更简单的查询是

      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 以及是否有权限=create,结果不一定是数组中的相同条目。

      祝你好运!

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 2015-11-18
      • 2022-01-09
      相关资源
      最近更新 更多