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 atributos

El patrón de atributos es un patrón de diseño de esquemas que ayuda a organizar documentos con muchos campos similares, especialmente cuando los campos comparten características comunes. Si necesitas ordenar o query en estos subconjuntos de campos similares, el patrón de atributo puede optimizar tu esquema. Permite una indexación más sencilla de documentos al consolidar varios campos similares por documento en un subdocumento de clave-valor. En lugar de crear múltiples índices en varios campos similares, el patrón de atributos permite crear menos índices, facilitando y agilizando la redacción de las queries.

Utiliza el patrón de atributo si se aplica alguna de las siguientes condiciones a tu colección:

  • Tiene documentos grandes que contienen muchos campos similares con características compartidas que desea ordenar o query.

  • Un pequeño subconjunto de los documentos contiene los campos necesarios para la ordenación.

Considere una colección de películas. Los documentos típicos de la colección pueden parecerse a esto:

db.movies.insertOne(
{
"_id": 1,
"title": "Star Wars",
"runtime": 121,
"directors": ["George Lucas"],
release_US: ISODate("1977-05-20T01:00:00+01:00"),
release_France: ISODate("1977-10-19T01:00:00+01:00"),
release_Italy: ISODate("1977-10-20T01:00:00+01:00"),
release_UK: ISODate("1977-12-27T01:00:00+01:00")
}
)

Tenga en cuenta los múltiples campos de fecha de lanzamiento para diferentes países en el documento anterior. Si desea buscar una fecha de lanzamiento, debe buscar en varios campos a la vez. Sin el patrón de atributos, tendrías que crear varios índices en el movies colección para realizar búsquedas rápidas en fechas de lanzamiento:

db.movies.createIndex({ release_US: 1 });
db.movies.createIndex({ release_France: 1 });
db.movies.createIndex({ release_Italy: 1 });
db.movies.createIndex({ release_UK: 1 });

Sin embargo, los índices son costosos y pueden ralentizar el rendimiento, especialmente en las operaciones de escritura. El siguiente procedimiento demuestra cómo puedes aplicar el patrón de atributo en la colección movies, moviendo el subconjunto de información de diferentes fechas de publicación a un arreglo, reduciendo la necesidad de indexación.

1

Reorganice el esquema para convertir los distintos campos de fecha de lanzamiento en un arreglo de pares clave-valor:

db.movies.insertOne(
{
"_id": 1,
"title": "Star Wars",
"runtime": 121,
"directors": ["George Lucas"],
releases: [
{
location: "USA",
date: ISODate("1977-05-20T01:00:00+01:00")
},
{
location: "France",
date: ISODate("1977-10-19T01:00:00+01:00")
},
{
location: "Italy",
date: ISODate("1977-10-20T01:00:00+01:00")
},
{
location: "UK",
date: ISODate("1977-12-27T01:00:00+01:00")
}
]
}
)
2

A continuación, puede crear un índice en el arreglo releases. Este índice optimiza las consultas sobre cualquiera de los campos de la fecha de lanzamiento para varios países.

db.movies.createIndex({ releases: 1 });

Si un documento tiene varios campos que rastrean las mismas características o características similares, el patrón de atributo evita la necesidad de crear índices en cada campo similar. Al consolidar campos similares en un arreglo y crear un índice sobre ese arreglo, se reduce el número total de índices requeridos y se mejora el rendimiento de las query.

El patrón de atributos puede ser útil cuando el documento describa las características de los elementos. Algunos productos, como la ropa, pueden tener tallas expresadas en pequeña, mediana o grande. Otros productos de la misma colección pueden expresarse en volumen, mientras que otros pueden expresarse en dimensiones físicas o peso.

Por ejemplo, consideremos una colección de botellas de agua. Un documento que no utilice el patrón de atributo puede verse así:

db.bottles.insertOne([
{
"_id": 1,
"volume_ml": 500,
"volume_ounces": 12
}
])

El siguiente código aplica el patrón de atributos a la colección bottles:

db.bottles.insertOne([
{
"_id": 1,
specs: [
{ k: "volume", v: "500", u: "ml" },
{ k: "volume", v: "12", u: "ounces" },
]
}
])

Dado que los campos volume_ml y volume_ounces en el primer documento contienen información similar, el esquema anterior los consolida en un solo campo, specs. El campo specs agrupa información sobre las especificaciones de medición de una botella de agua determinada, donde el campo k especifica qué se está midiendo, v especifica el valor y u especifica la unidad de medición.

El patrón de atributos también te permite agrupar campos similares con nombres diferentes. Al especificar atributos mediante pares clave-valor, como el campo k, que especifica lo que se está midiendo, puedes almacenar una mayor variedad de campos similares en un solo arreglo, minimizando el número de índices que necesitas para consultar eficientemente tus datos.

Por ejemplo, considere este documento en la colección bottles que no utiliza el patrón de atributo. Este documento almacena especificaciones sobre el volumen y la altura de la botella de agua:

db.bottles.insertOne([
{
"_id": 1,
"volume_ml": 500,
"volume_ounces": 12,
"height_inches": 8
}
])

El siguiente código aplica el patrón de atributo al documento. Agrupa los campos volume_ml, volume_ounces y height_inches en el arreglo specs:

db.bottles.insertOne([
{
"_id": 1,
specs: [
{ k: "volume", v: "500", u: "ml" },
{ k: "volume", v: "12", u: "ounces" },
{ k: "height", v: "8", u: "inches" }
]
}
])

El uso de pares clave-valor, como k, v y u, permite una mayor flexibilidad en cuanto a los campos que puedes añadir al arreglo. Cuantos más campos pueda consolidar en el arreglo, menos índices necesitará crear, maximizando el rendimiento de las queries.

Volver

Patrón de valores atípicos

En esta página