mongo eval方法执行需要认证解决办法

mongo删除数据后,仍然占用磁盘空间,导致无法获知真正仍可用的空闲磁盘空间的大小。为了释放空间,采用先复制集合数据,然后在删除旧集合的策略。由于copyTo()方法会把整个数据库锁住,所以采用eval()方法进行复制集合。


db.runCommand({     eval: function(source, dest) {         var count = 0;         var errorId;         var doc = db.getCollection(source).find().sort({ _id: 1 });         var d;         while (doc.hasNext()) {             d = doc.next();             try {                 db.getCollection(dest).insertOne(d);                 count++;             } catch (e) {                 errorId = d._id;                 break;             }         }          return { count: count, errorId: errorId };     },     nolock: true,     args: ["name1", 'name2'] });

执行后报错:

{
    "ok" : 0.0,
    "errmsg" : "not authorized on dbName to execute command ...}",
    "code" : 13
}

根据官方的解决办法如下:

1.首先创建角色

db.createRole(
    {
      "role": "evalRole",
      "db": "admin",
      "privileges": [
        {"resource": {"anyResource": true }, "actions": ["anyAction"] } 
       ],
      "roles": [
        {"role": "root", "db": "admin"}
      ]
    }
)
2.将角色授权给需要操作的用户。

为了方便,直接将该角色添加到现有的登陆账户中。修改system.users集合中对应的用户信息。在roles属性中添加{"role" : "evalRole", "db" : "admin"}

为了安全起见,最好将该权限仅赋给一个用户。因为该角色可以对任何资源进行任何操作。

详细信息见官方文档:https://docs.mongodb.com/manual/reference/command/eval/index.html中的内容。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值