Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

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.

Hay varias opciones sobre cómo almacenar tus datos archivados. Por ejemplo, puedes:

  • Mover los datos a 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, trasladar los datos a un almacenamiento de archivos externo es la mejor opción en términos de costo y rendimiento. Si el almacenamiento externo de archivos no es posible para su caso de uso, considere trasladar los datos a un clúster o colección separados.

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

  • Tus datos archivados deberían utilizar un modelo de datos incrustado, en lugar de 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 tienes documentos que nunca deben caducar o moverse al fichero, establece la antigüedad del documento en keep forever, o en una string similar para indicar que el documento debe permanecer en la colección activa.

  • MongoDB Atlas ofrece Archivo en línea, que traslada los datos con acceso infrecuente de tu clúster de Atlas a una instancia federada de base de datos gestionada por MongoDB en un almacenamiento de objetos en la nube de solo lectura.

En este ejemplo, una tienda de comercio electrónico quiere archivar datos de ventas que ocurrieron hace más de cinco años. El conjunto de datos inicial contiene todas las ventas y los documentos correspondientes a ventas anteriores se moverán a una colección 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

Nota

El siguiente script utiliza la sintaxis de MongoDB Shell. Para consultar la sintaxis de agregación y query específica de tu driver, consulta la documentación de tu 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);
}

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