我有一个简单的集合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/