Mongodb
system.profile
集合上的 Map-Reduce
我有一個簡單的集合
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/