Docs Menu
Docs Home
/ /

Patrón de fichero

Si necesita almacenar datos históricos de varios años, almacenar los datos más antiguos en la misma base de datos que los más recientes puede afectar negativamente al rendimiento, especialmente si no necesita acceder a ellos con frecuencia. En su lugar, puede diseñar su esquema para archivar los datos antiguos y moverlos a una ubicación de almacenamiento independiente.

Existen múltiples opciones para almacenar sus datos archivados. Por ejemplo, puede:

  • Mueva los datos a un almacenamiento de archivos externo, como Amazon S3.

  • Mueva los datos a un clúster separado y más económico.

  • Mover datos a una colección separada en el mismo clúster.

En la mayoría de los casos, migrar los datos a un almacenamiento de archivos externo es la mejor opción en términos de costo y rendimiento. Si el almacenamiento de archivos externo no es posible para su caso, considere migrar los datos a un clúster o colección independiente.

Antes de implementar un patrón de diseño de archivo de datos, revisa estas mejores prácticas:

  • Sus datos archivados deben utilizar un Modelo de datos incrustado, en lugar de usar referencias a otras colecciones. Al consultar datos archivados, todos los componentes relevantes deben ser del mismo periodo. La incrustación de datos garantiza que las consultas devuelvan los datos relacionados juntos.

  • La antigüedad del documento debe estar contenida en un solo campo.

  • Si tiene documentos que nunca deben caducar ni trasladarse al archivo, configure la antigüedad del documento en keep forever, o una cadena similar para indicar que el documento debe permanecer en la colección activa.

  • MongoDB Atlas ofrece Archivo en línea, que mueve datos a los que se accede con poca frecuencia desde su clúster Atlas a una instancia de base de datos federada de solo lectura administrada por MongoDB en un almacenamiento de objetos en la nube.

En este ejemplo, una tienda de comercio electrónico desea archivar datos de ventas realizadas hace más de cinco años. El conjunto de datos inicial contiene todas las ventas, y los documentos de ventas anteriores se moverán a una colección independiente.

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

Nota

El siguiente script utiliza la sintaxis de MongoDB Shell. Para ver la sintaxis de agregación y consulta de su controlador, consulte la documentación del mismo.

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

Después de ejecutar el script, la colección sales ya no contiene ventas que ocurrieron hace más de cinco años.

db.sales.find()

Salida:

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

Las ventas antiguas ahora existen en la colección archived_sales.

db.archived_sales.find()

Salida:

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

Volver

Dimensiones de cambio lento

Obtén una insignia de habilidad

¡Domina gratis la “Optimización del diseño de esquemas”!

Más información

En esta página