Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En el lenguaje de consulta, los datos no tienen esquema y normalmente se desnormalizan. En lugar de combinar datos entre entidades y conjuntos, como lo haría en una base de datos relacional, las combinaciones se producen dentro de un solo elemento. En concreto, las combinaciones se limitan a ese elemento y no se pueden producir en varios elementos y contenedores.
Sugerencia
Si necesita unirse entre elementos y contenedores, considere la posibilidad de volver a trabajar el modelo de datos para evitar este antipatrón.
Autocombinación con un solo elemento
Echemos un vistazo a un ejemplo de una autocombinación dentro de un elemento. Considere la posibilidad de un contenedor con un solo elemento. Este elemento representa un producto con varios tamaños:
[
{
"name": "Raiot Jacket",
"sizes": [
{
"key": "s",
"description": "Small"
},
{
"key": "m",
"description": "Medium"
},
{
"key": "l",
"description": "Large"
},
{
"key": "xl",
"description": "Extra Large"
}
]
}
]
¿Qué ocurre si necesita encontrar productos con un tamaño específico? Normalmente, tendría que escribir una consulta que tenga un filtro que compruebe cada índice potencial de la sizes matriz para un valor con un prefijo. En este ejemplo, la consulta busca todos los productos con un tamaño que termina con Large:
SELECT
*
FROM
products p
WHERE
p.sizes[0].description LIKE "%Large" OR
p.sizes[1].description LIKE "%Large" OR
p.sizes[2].description LIKE "%Large" OR
p.sizes[3].description LIKE "%Large"
Esta técnica se puede volver intensable rápidamente. La complejidad o longitud de la sintaxis de consulta aumenta el número de elementos potenciales de la matriz. Además, esta consulta no es lo suficientemente flexible como para controlar productos futuros, que pueden tener más de tres tamaños.
En una base de datos relacional tradicional, los tamaños se separarían en una tabla independiente y se realiza una combinación entre tablas con un filtro aplicado a los resultados. En el lenguaje de consulta, podemos realizar una operación de autocombinación dentro del elemento mediante la JOIN palabra clave :
SELECT
p.name,
s.key,
s.description
FROM
products p
JOIN
s in p.sizes
Esta consulta devuelve una matriz simple con un elemento para cada valor de la matriz de etiquetas.
[
{
"name": "Raiot Jacket",
"key": "s",
"description": "Small"
},
{
"name": "Raiot Jacket",
"key": "m",
"description": "Medium"
},
{
"name": "Raiot Jacket",
"key": "l",
"description": "Large"
},
{
"name": "Raiot Jacket",
"key": "xl",
"description": "Extra Large"
}
]
Vamos a desglosar la consulta. La consulta ahora tiene dos alias: p para cada elemento de producto del conjunto de resultados y s para la matriz autocomoda sizes . La * palabra clave solo es válida para proyectar todos los campos si puede deducir el conjunto de entrada, pero ahora hay dos conjuntos de entrada (p y t). Debido a esta restricción, debemos definir explícitamente los campos devueltos como name del producto junto con key, y description de los tamaños.
Por último, podemos usar un filtro para buscar los tamaños que terminan con Large. Dado que usamos la JOIN palabra clave , nuestro filtro es lo suficientemente flexible como para controlar cualquier número variable de etiquetas:
SELECT
p.name,
s.key AS size
FROM
products p
JOIN
s in p.sizes
WHERE
s.description LIKE "%Large"
[
{
"name": "Raiot Jacket",
"size": "l"
},
{
"name": "Raiot Jacket",
"size": "xl"
}
]
Unión automática de varios elementos
Vamos a pasar a un ejemplo en el que necesitamos encontrar un valor dentro de una matriz que existe en varios elementos. En este ejemplo, considere un contenedor con dos elementos de producto. Cada elemento contiene relevante colors para ese elemento.
[
{
"name": "Gremon Fins",
"colors": [
"science-blue",
"turbo"
]
},
{
"name": "Elecy Jacket",
"colors": [
"indigo-shark",
"jordy-blue-shark"
]
},
{
"name": "Tresko Pack",
"colors": [
"golden-dream"
]
}
]
¿Qué ocurre si necesita encontrar todos los elementos con un color que incluya blue en el nombre? Puede buscar manualmente la cadena blue, pero tendría que escribir una consulta compleja que tenga en cuenta dos características de estos elementos:
Los colores con una
bluesubcadena se producen en índices diferentes de cada matriz. Para elElecy Jacketproducto, el color es el segundo elemento (índice:1). Para elGremon Finsproducto, la etiqueta es el primer elemento (índice:0). ElTresko Packproducto no tiene ninguna que contenga esta subcadena.La
colorsmatriz de cada elemento es de una longitud diferente. LosGremon Finsproductos yElecy Jackettienen dos colores, mientras que elTresko Packproducto solo tiene uno.
Aquí, la JOIN palabra clave es una excelente herramienta para crear un producto cruzado de los elementos y colores. Las combinaciones crean un producto cruzado completo de los conjuntos que participan en la combinación. El resultado es un conjunto de tuplas con cada permutación del elemento y los valores de la matriz de destino.
Una operación de combinación en nuestros productos y colores de ejemplo crea los siguientes elementos:
| Producto | Color |
|---|---|
Gremon Fins |
science-blue |
Gremon Fins |
turbo |
Elecy Jacket |
indigo-shark |
Elecy Jacket |
jordy-blue-shark |
Tresko Pack |
golden-dream |
En este ejemplo, la consulta NoSQl usa la JOIN palabra clave para crear un producto cruzado y devuelve todas las permutaciones:
SELECT
p.name,
c AS color
FROM
products p
JOIN
c in p.colors
[
{
"name": "Elecy Jacket",
"color": "indigo-shark"
},
{
"name": "Elecy Jacket",
"color": "jordy-blue-shark"
},
{
"name": "Gremon Fins",
"color": "science-blue"
},
{
"name": "Gremon Fins",
"color": "turbo"
},
{
"name": "Tresko Pack",
"color": "golden-dream"
}
]
Al igual que con el único elemento, puede aplicar un filtro aquí para buscar solo elementos que coincidan con una etiqueta específica. Por ejemplo, esta consulta busca todos los elementos con una subcadena que contiene blue para cumplir el requisito inicial mencionado anteriormente en esta sección.
SELECT
p.name,
c AS color
FROM
products p
JOIN
c in p.colors
WHERE
c LIKE "%blue%"
[
{
"name": "Elecy Jacket",
"color": "jordy-blue-shark"
},
{
"name": "Gremon Fins",
"color": "science-blue"
}
]
Esta consulta se puede refinar aún más para devolver simplemente los nombres de los productos que cumplen el filtro. En este ejemplo no se proyectan los valores de color, pero el filtro sigue funcionando según lo previsto:
SELECT VALUE
p.name
FROM
products p
JOIN
c in p.colors
WHERE
c LIKE "%blue%"
[
"Elecy Jacket",
"Gremon Fins"
]