Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/ /
/ / /

Agrupar datos con el patrón de subconjuntos

MongoDB mantiene los datos frecuentemente accesados, denominados conjunto de trabajo, en RAM. Cuando el conjunto de trabajo de datos e índices crece más allá de la memoria RAM física asignada, el rendimiento se reduce a medida que comienzan a ocurrir accesos al disco y los datos ya no se recuperan de la RAM.

Para solucionar este problema, puedes fragmentar tu colección. Sin embargo, el particionado puede generar costos y complejidades adicionales para los cuales la aplicación puede no estar preparada. En lugar de fragmentar tu colección, puedes reducir el tamaño de tu conjunto de trabajo utilizando el patrón de subconjunto.

El patrón de subconjunto es una técnica de modelado de datos que se utiliza para gestionar escenarios en los que se tiene un gran arreglo de elementos dentro de un documento, pero se necesita acceder de manera frecuente a un pequeño subconjunto de esos elementos. En este caso, el tamaño del documento a menudo puede hacer que el conjunto de trabajo supere la capacidad de RAM de la computadora. El patrón de subconjunto ayuda a optimizar el rendimiento al reducir la cantidad de datos que deben leerse de la base de datos para consultas comunes.

Considera un sitio de comercio electrónico que tiene una lista de revisiones para un producto, guardado en una colección llamada products. El sitio de comercio electrónico inserta documentos con el siguiente esquema en la colección products:

db.collection('products').insertOne( [
{
_id: ObjectId("507f1f77bcf86cd99338452"),
name: "Super Widget",
description: "This is the most useful item in your toolbox."
price: { value: Decimal128("119.99"), currency: "USD" },
reviews: [
{
review_id: 786,
review_author: "Kristina",
review_text: "This is indeed an amazing widgt.",
published_date: ISODate("2019-02-18")
},
{
review_id: 785,
review_author: "Trina",
review_text: "Very nice product, slow shipping.",
published_date: ISODate("2019-02-17")
},
[...],
{
review_id: 1,
review_author: "Hans",
review_text: "Meh, it's ok.",
published_date: ISODate("2017-12-06")
}
]
}
] )

Al acceder a los datos de un producto, probablemente sólo se necesitan las revisiones más recientes. El siguiente procedimiento demuestra cómo aplicar el patrón de subconjunto al esquema anterior.

1

En un campo de arreglo que contiene información sobre un documento, determine el subconjunto de información al que necesita acceder más. Por ejemplo, en la colección products, podrías necesitar acceder solo a las diez reseñas más recientes.

2

En lugar de almacenar todas las revisiones con el producto, divide tu colección en dos: una para tus datos más accedidos y otra para tus datos menos accedidos. Esto permite un acceso rápido a los datos más relevantes sin tener que cargar todo el arreglo.

La primera colección, la colección products, contiene los datos que más se utilizan, tales como las revisiones actuales:

db.collection('products').insertOne( [
{
_id: ObjectId("507f1f77bcf86cd99338452"),
name: "Super Widget",
description: "This is the most useful item in your toolbox."
price: { value: Decimal128("119.99"), currency: "USD" },
reviews: [
{
review_id: 786,
review_author: "Kristina",
review_text: "This is indeed an amazing widget.",
published_date: ISODate("2019-02-18")
},
[...],
{
review_id: 776,
review_author: "Pablo",
review_text: "Amazing!",
published_date: ISODate("2019-02-15")
}
]
}
] )

La colección products solo contiene las 10 revisiones más recientes. Esto reduce el conjunto de trabajo al cargar únicamente una porción o un subconjunto de los datos totales.

La segunda colección, la colección reviews, contiene datos de uso menos frecuente, como reseñas antiguas:

db.collection('review').insertOne( [
{
review_id: 786,
review_author: "Kristina",
review_text: "This is indeed an amazing widget.",
product_id: ObjectId("507f1f77bcf86cd99338452"),
published_date: ISODate("2019-02-18")
},
{
review_id: 785,
review_author: "Trina",
review_text: "Very nice product, slow shipping.",
product_id: ObjectId("507f1f77bcf86cd99338452"),
published_date: ISODate("2019-02-17")
},
[...],
{
review_id: 1,
review_author: "Hans",
review_text: "Meh, it's ok.",
product_id: ObjectId("507f1f77bcf86cd99338452"),
published_date: ISODate("2017-12-06")
}
] )

Puede acceder a la colección reviews cada vez que necesite ver revisiones adicionales. Al considerar dónde dividir tus datos, almacena los campos más utilizados de tus documentos en tu colección principal y los datos menos frecuentemente utilizados en una nueva colección.

Al utilizar documentos más pequeños con datos a los que se accede con mayor frecuencia, reduces el tamaño general del conjunto de trabajo. Esto permite tiempos de acceso al disco más cortos para la información que tu aplicación necesita con mayor frecuencia.

Nota

El patrón de subconjunto requiere que gestione dos colecciones, en lugar de una, así como consultar varias bases de datos cuando se necesitan reunir información completa sobre un documento, en lugar del subconjunto.

Volver

Patrón de atributo

En esta página