Menu Docs

Padrão de arquivo

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.

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.

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.

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.

1
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")
}
] )
2

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);
}

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')
}
]