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中的内容。