Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Patrón de fichero

Si necesitas almacenar datos históricos de hace varios años, almacenar tus datos más antiguos en la misma base de datos que tus datos más recientes puede afectar negativamente el rendimiento, especialmente si no es necesario acceder con frecuencia a los datos antiguos. En su lugar, se puede diseñar el esquema para archivar los datos antiguos y trasladar esos datos 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.

  • Mover los datos a un clúster separado y más barato.

  • Mueva los 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:

  • Tus datos de fichero deben utilizar un modelo de datos integrado, en lugar de utilizar referencias a otras colecciones. Cuando query datos fichados, todos los componentes relevantes de los datos deben ser del mismo momento. El incrustamiento de datos garantiza que las consultas devuelvan los datos relacionados juntos.

  • La 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 los datos accedidos con poca frecuencia de tu clúster de Atlas a una instancia federada de base de datos de solo lectura gestionada 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