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
/ /
/ / /

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 supera la RAM física asignada, el rendimiento se reduce, ya que se inician accesos al disco y ya no se recuperan datos de la RAM.

Para solucionar este problema, puede fragmentar su colección. Sin embargo, la fragmentación puede generar costos y complejidades adicionales para las que su aplicación podría no estar preparada. En lugar de fragmentar su colección, puede reducir el tamaño de su 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 dispone de una gran cantidad de elementos en un documento, pero se necesita acceder con frecuencia a un pequeño subconjunto de ellos. En este caso, el tamaño del documento puede provocar que el conjunto de trabajo supere la capacidad de RAM del ordenador. El patrón de subconjunto ayuda a optimizar el rendimiento al reducir la cantidad de datos que se deben leer 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