Padrão de arquivo
Nesta página
Se você precisar armazenar dados históricos de vários anos, armazenar os dados mais antigos no mesmo banco de dados que os dados mais recentes pode impacto negativamente o desempenho, especialmente se os dados antigos não precisarem ser acessados com frequência. Em vez disso, você pode projetar seu esquema para arquivar dados antigos e mover esses dados para um local de armazenamento separado.
Sobre esta tarefa
Existem várias opções de como armazenar seus dados arquivados. Por exemplo, você pode:
Mova dados para armazenamento de arquivo externo, como Amazon S3.
Mova dados para um cluster separado e mais barato.
Mova dados para uma collection separada no mesmo cluster.
Na maioria dos casos, mover dados para armazenamento de arquivos externo é a melhor opção em termos de custo e desempenho. Se o armazenamento externo de arquivos não for possível para seu caso de uso, considere mover dados para um cluster ou collection separado.
Dicas para arquivamento de dados
Antes de implementar um padrão de design de arquivamento de dados, revise estas práticas recomendadas:
Seus dados arquivados devem usar um modelo de dados incorporado, em vez de usar referências a outras collections. Quando você consulta dados arquivados, todos os componentes relevantes dos dados devem ser da mesma época. A incorporação de dados garante que as queries retornem os dados relacionados juntos.
A idade do documento deve estar contida em um único campo.
Se você tiver documentos que nunca devem expirar ou ser movidos para o arquivo, defina a idade do documento como
keep forever
ou uma string semelhante para indicar que o documento deve permanecer na coleção ativa.O MongoDB Atlas oferece o Arquivo Online, que move dados acessados com pouca frequência do seu cluster Atlas para uma Instância de Banco de Dados Federada gerenciada MongoDB somente para leitura em um armazenamento de objeto na nuvem.
Cenário
Neste exemplo, uma loja e-commerce deseja arquivar dados de vendas que ocorreram há mais de cinco anos. O conjunto de dados inicial contém todas as vendas, e os documentos de vendas mais antigas serão movidos para uma collection separada.
Passos
Preencher dados de amostra
db.sales.insertMany( [ { customer_name: "Hiroshi Tanaka", products: [ { product_id: "P1001", name: "Wireless Headphones", quantity: 1, price: 59.99 }, { product_id: "P1002", name: "Phone Charger", quantity: 2, price: 14.99 } ], total_amount: 89.97, date: ISODate("2025-01-30T10:15:00Z") }, { customer_name: "Aisha Khan", products: [ { product_id: "P1003", name: "Laptop", quantity: 1, price: 899.99 } ], total_amount: 899.99, date: ISODate("2018-11-20T15:45:00Z") // Over 5 years ago }, { customer_name: "Fatima Al-Farsi", products: [ { product_id: "P1006", name: "Gaming Mouse", quantity: 1, price: 49.99 }, { product_id: "P1007", name: "Mechanical Keyboard", quantity: 1, price: 129.99 } ], total_amount: 179.98, date: ISODate("2017-06-15T12:00:00Z") // Over 5 years ago }, { customer_name: "Nguyen Minh", products: [ { product_id: "P1008", name: "Bluetooth Speaker", quantity: 2, price: 39.99 } ], total_amount: 79.98, date: ISODate("2025-01-26T09:20:00Z") } ] )
Escreva um roteiro para arquivar documentos antigos
Observação
O roteiro a seguir usa a sintaxe do shell MongoDB . Para ver a sintaxe de agregação e consulta do seu driver, consulte a documentação do driver.
// Set a variable to five years before the time that the script runs const fiveYearsAgo = new Date(); fiveYearsAgo.setFullYear(fiveYearsAgo.getFullYear() - 5); // Write old sales to the 'archived_sales' collection const writeOldSalesPipeline = [ { $match: { date: { $lt: fiveYearsAgo } } }, { $merge: { into: { db: "test", coll: "archived_sales", }, on: "_id" } } ] db.sales.aggregate(writeOldSalesPipeline) // Delete old sales from the active 'sales' collection try { db.sales.deleteMany( { date : { $lt: fiveYearsAgo } } ); } catch (e) { print (e); }
Resultados
Depois de executar o script, a collection sales
não contém mais vendas que ocorreram há mais de cinco anos.
db.sales.find()
Saída:
[ { _id: ObjectId('679ced18fa29d32ca7d1abab'), customer_name: 'Hiroshi Tanaka', products: [ { product_id: 'P1001', name: 'Wireless Headphones', quantity: 1, price: 59.99 }, { product_id: 'P1002', name: 'Phone Charger', quantity: 2, price: 14.99 } ], total_amount: 89.97, date: ISODate('2025-01-30T10:15:00.000Z') }, { _id: ObjectId('679ced18fa29d32ca7d1abae'), customer_name: 'Nguyen Minh', products: [ { product_id: 'P1008', name: 'Bluetooth Speaker', quantity: 2, price: 39.99 } ], total_amount: 79.98, date: ISODate('2025-01-26T09:20:00.000Z') } ]
As vendas antigas agora existem na coleção archived_sales
.
db.archived_sales.find()
Saída:
[ { _id: ObjectId('679ced18fa29d32ca7d1abac'), customer_name: 'Aisha Khan', products: [ { product_id: 'P1003', name: 'Laptop', quantity: 1, price: 899.99 } ], total_amount: 899.99, date: ISODate('2018-11-20T15:45:00.000Z') }, { _id: ObjectId('679ced18fa29d32ca7d1abad'), customer_name: 'Fatima Al-Farsi', products: [ { product_id: 'P1006', name: 'Gaming Mouse', quantity: 1, price: 49.99 }, { product_id: 'P1007', name: 'Mechanical Keyboard', quantity: 1, price: 129.99 } ], total_amount: 179.98, date: ISODate('2017-06-15T12:00:00.000Z') } ]