Tenho uma coleção simples posts
com alguns documentos. Eu configurei o nível de criação de perfil para 2, permitindo que as informações de criação de perfil sejam coletadas em outra coleção system.profile
. Meu objetivo é usar uma operação mapReduce para coletar informações da command
entrada agrupada por meio de vários atores usando esta consulta simples:
db.system.profile.mapReduce(
function()
{
emit( this.appName, this.command );
},
function( key, values )
{
return JSON.stringify(values);
},
{
query: {},
out : "command_maps"
}
)
No entanto, tentar isso no REPL produz o seguinte erro
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
Suspeito que o mongo esteja tentando gravar temporariamentesystem.profile
na coleção e falhe devido ao fato de ser somente leitura em certo sentido. Existe alguma maneira de executar isso com sucesso?
Infelizmente, os documentos são muito grandes para serem adicionados aqui, mas basicamente é mais ou menos assim:
DOCUMENTO
{
"appName": "actor1",
"command": {"find": {},"ns" : "test.post""}
},
{ "appName": "actor2",
"command": { "find": {},"ns" : "test.comments"}
}
{
"appName": "actor1",
"command": { "insert": {},}
}
RESULTADO
{ appName: "actor1": command_maps: '[{command: "find"}, {command:"query"} ...]' }
{ appName: "actor2": command_maps: '[{command: "find"}...]' }
Versão: MongoDB shell versão v4.4.5
PS: mapReduce está funcionando corretamente em coleções regulares