[2022-02-23T19:29:36.020] [ERROR] default - MongoServerError: Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.
at MessageStream.messageHandler (/app/node_modules/mongodb/lib/cmap/connection.js:462:30)
at MessageStream.emit (node:events:520:28)
at processIncomingData (/app/node_modules/mongodb/lib/cmap/message_stream.js:108:16)
at MessageStream._write (/app/node_modules/mongodb/lib/cmap/message_stream.js:28:9)
at writeOrBuffer (node:internal/streams/writable:389:12)
at _write (node:internal/streams/writable:330:10)
at MessageStream.Writable.write (node:internal/streams/writable:334:10)
at Socket.ondata (node:internal/streams/readable:754:22)
at Socket.emit (node:events:520:28)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9)
at Socket.Readable.push (node:internal/streams/readable:228:10)
at TCP.onStreamRead (node:internal/stream_base_commons:190:23) {
ok: 0,
code: 292,
codeName: 'QueryExceededMemoryLimitNoDiskUseAllowed'
}
O que pode ser este erro ?
Vejo que é falta de memoria QueryExceededMemoryLimitNoDiskUseAllowed, mas como resolver ?
Esqueci de colocar o código
const Zanzar = db.Mongoose.model(
"zanzar_midia",
db.ZanzarMidiaSchema,
"zanzar_midia"
);
let where = {
data_hora: {
$gte: dataInicioQuery.toISOString(),
$lte: dataFimQuery.toISOString(),
},
nome_campanha: campanha,
};
const zanzar = await Zanzar.find(where).sort({
data_hora: -1,
id_campanha: -1,
});
Mongo com node.js
Nunca tinha ouvido falar desse erro. Achei um blog que explica como arrumar: MongoDB Sort : how to fix maximum RAM exceeded error – Developers Log
Pelo que entendi, para evitar esse problema, o mongo executa a consulta com base no sort especificado no índice usado, assim: https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/
Caso não tenha índice criado, o mongo recupera todos os documentos da consulta e tenta realizar o sort em memória. E é ai que ocorre esse erro caso o limite seja ultrapassado.
Uma solução seria criar o índice e usar ele para fazer sort ou alterar o limite do sort em memória:
db.adminCommand({
setParameter: 1,
internalQueryExecMaxBlockingSortBytes: 335544320
})
Essa solução de aumentar a memória está no primeiro link que postei. Mas recomendo a leitura no segundo link, pq aumentar recursos nesses casos, geralmente apenas empurra o problema para frente.
1 curtida
A principio criei os indices dos dois campos
data_hora: -1,
id_campanha: -1,
E funcionou
1 curtida
Excelente solução. Usar o índice é melhor do que ir aumentando o uso de recursos.
1 curtida