Primeiro, você menciona que é não indexada / não otimizada - há pelo menos um índice em created_at
? Se não, você está fazendo uma consulta massivamente ineficiente (uma varredura de tabela) e isso não será muito rápido.
Em geral, provavelmente a maneira mais fácil de fazer isso é apenas ter o servidor existente como primário e então criar um secundário (veja Conceitos fundamentais do conjunto de réplicas . Em um conjunto de réplicas, quando você adiciona um novo secundário, ele sincroniza a partir do primário, clonando todos os dados existentes e, em seguida, aplicando quaisquer alterações subsequentes por meio do oplog . Quando estiver satisfeito por ter todos os dados necessários (e supondo que não deseja manter o conjunto de réplicas), basta reiniciar o mongod
s sem o argumento --replSet
(e em uma porta diferente é geralmente um bom idéia) e você terá uma cópia completa no novo host.
Uma abordagem mais manual seria desligar o atual mongod
(ou fsyncLock()
para garantir que não haja alterações) e, em seguida, copie os arquivos do banco de dados manualmente para um novo host - eles estarão no seu dbpath
e ficarão assim:
<databasename>.ns
<databasename>.0
<databasename>.1
<databasename>.2
etc.
Eles contêm todas as informações que serão necessárias em mongod
, portanto, depois de copiá-las para o novo host e iniciar a instância do MongoDB, você deve ser capaz de simplesmente use <databasename>
e estar pronto.
Em cada caso, para quaisquer porções não utilizadas / indesejadas, basta soltá-las quando estiver em funcionamento no novo host e, em seguida, executar um repair se você quiser recuperar espaço no disco.
Por fim, se você realmente quiser apenas extrair uma parte dos registros, poderá mongodump a coleção relevante com um filtro de consulta e, em seguida, use mongorestore para importar para o novo host. Eu não acho que isso será massivamente mais rápido do que o rubi que você propõe acima, especialmente se você está faltando esse created_at
index.