Mongodb

system.profile 集合上的 Map-Reduce

  • May 29, 2021

我有一個簡單的集合posts,裡面有一些文件。我已將分析級別設置為 2,以便將分析資訊收集到另一個集合system.profile中。我的目標是使用mapReducecommand操作從使用這個簡單查詢的各種參與者分組的條目中收集資訊:

db.system.profile.mapReduce(
   function()
   {
       emit( this.appName, this.command  );
   },
   function( key, values ) 
   {
       return JSON.stringify(values);
   },
   {
       query: {},
       out  : "command_maps"
   }
)

但是,在 REPL 中嘗試這樣做會產生以下錯誤

2021-05-10T22:09:33.494+0800 E QUERY    [js] Error: map reduce failed:{
   "ok" : 0,
   "errmsg" : "rename failed: { ok: 0.0, errmsg: \"error with source namespace: cannot write to 'test.tmp.mr.system.profile_22'\", code: 20, codeName: \"IllegalOperation\" }",
   "code" : 10076,
   "codeName" : "Location10076"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DBCollection.prototype.mapReduce@src/mongo/shell/collection.js:1145:1
@(shell):1:1

我懷疑 mongo 正試圖暫時寫入system.profile集合併由於它在某種意義上是只讀的而失敗。有什麼辦法可以成功執行嗎?

不幸的是,文件太大,無法在此處添加,但基本上是這樣的:

文件

{ 
  "appName": "actor1",     
  "command": {"find": {},"ns" : "test.post""} 
}, 
{  "appName": "actor2", 
  "command": { "find": {},"ns" : "test.comments"} 
}
{
  "appName": "actor1",
  "command": { "insert": {},}
}

輸出

{  appName: "actor1": command_maps: '[{command: "find"}, {command:"query"} ...]' } 
{    appName: "actor2": command_maps: '[{command: "find"}...]' } 

版本:MongoDB shell 版本 v4.4.5

PS:mapReduce 在正常集合上正常工作

因此,readWrite在集合上執行 mapReduce 似乎需要特殊權限system.profile。所以我在檢查後最終讓查詢工作:

https://docs.mongodb.com/manual/tutorial/manage-users-and-roles/

引用自:https://dba.stackexchange.com/questions/291312