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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章