Erro mongo - resolvido

[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

Obrigado @Lucas_Camara