Agregar código JavaScript para usarlo con Cosmos DB
En esta unidad, aprenderá a usar palabras clave de SQL como LIKE, JOIN y WHERE para consultar datos con el SDK de Cosmos.
Operaciones de consulta en el contenedor
Las operaciones de consulta son específicas del contenedor. Como la consulta se ejecuta en el contenedor mismo, no es necesario que utilice el nombre correcto del contenedor, como products
. En el portal o en la documentación de referencia del SDK, puede ver el nombre del contenedor como root
o c
para indicar el contenedor.
Consulta de todos los documentos
Para buscar documentos en el contenedor de una base de datos de Cosmos DB Core (SQL), use el método query del SDK en el objeto de contenedor, con una especificación de consulta. La especificación de consulta requiere la propiedad query
y una propiedad parameters
de opción.
Propiedad | Propósito |
---|---|
query (obligatorio) | Texto de la consulta SQL. Una consulta simple es select * from products . |
parameters (opcional) | Sustitución de variables en la consulta. El nombre corresponde al nombre que se usa en la consulta y el valor es la sustitución real. Puede proporcionar hasta 10 parámetros. |
const querySpecification = {
query: `select * from products`,
parameters: undefined
};
Esta consulta devuelve todos los documentos del contenedor.
Consulta de documentos por nombre mediante LIKE en un contenedor
Para mejorar la búsqueda sin dejar de brindar cierta flexibilidad, use la palabra clave LIKE para permitir cualquier coincidencia en la propiedad del documento donde la propiedad de nombre del documento incluya el valor Blue. El valor Blue puede estar al comienzo, al final o al medio del nombre, porque está encapsulado entre signos de porcentaje, %
.
// SQL Query specification
const querySpec = {
// SQL query text using LIKE keyword and parameter
query: `select * from products p where p.name LIKE @propertyValue`,
// Optional SQL parameters, to be used in query
parameters: [
{
// name of property to find in query text
name: "@propertyValue",
// value to insert in place of property
value: `%Blue%`,
}
]
};
Uso de la palabra clave LIKE
Ejecute la consulta en el contenedor para capturar los documentos. Los resultados de la consulta se capturan con fetchAll
y se devuelven en la propiedad desestructurada, resources
.
// Execute query
const { resources } = await container.items.query(querySpec).fetchAll();
Recorre toda la colección en iteración y usa el bucle for/of.
let i = 0;
// Show results of query
for (const item of resources) {
console.log(`${++i}: ${item.id}: ${item.name}, ${item.sku}`);
}
El resultado se parece a lo siguiente:
1: 08225A9E-F2B3-4FA3-AB08-8C70ADD6C3C2: Touring-1000 Blue, 50, BK-T79U-50
2: 2C981511-AC73-4A65-9DA3-A0577E386394: Touring-1000 Blue, 46, BK-T79U-46
3: 44873725-7B3B-4B28-804D-963D2D62E761: Touring-1000 Blue, 60, BK-T79U-60
4: 4E4B38CB-0D82-43E5-89AF-20270CD28A04: Touring-2000 Blue, 60, BK-T44U-60
5: 5308BAE7-B0CB-4883-9A93-192CB10DC94F: Touring-3000 Blue, 44, BK-T18U-44
Consulta de documentos por propiedad de cadena mediante LIKE en un contenedor
Para que la consulta sea más flexible, encapsúlela en una función que toma la propiedad de un documento y su valor que se va a buscar.
// Find all products that match a property with a value like `value`
async function executeSqlFind(property, value) {
// Build query
const querySpec = {
query: `select * from products p where p.${property} LIKE @propertyValue`,
parameters: [
{
name: "@propertyValue",
value: `${value}`,
},
],
};
// Show query
console.log(querySpec);
// Get results
const { resources } = await container.items.query(querySpec).fetchAll();
let i = 0;
// Show results of query
for (const item of resources) {
console.log(`${++i}: ${item.id}: ${item.name}, ${item.sku}`);
}
}
La propiedad y el valor se pasan a la función y se usan en la consulta para los valores de cadena.
Consulta de documentos y devolución de subpropiedades de inventario mediante la palabra clave JOIN en un contenedor
La forma del documento incluye dos subpropiedades, etiquetas e inventario. Para acceder a estas subpropiedades, use la palabra clave JOIN. El formato de la consulta SQL siguiente solo facilita la legibilidad y no es necesario usarla con el SDK de Cosmos DB.
SELECT
p.id,
p.name,
i.location,
i.inventory
FROM
products p
JOIN
inventory i IN p.inventory
WHERE
p.name LIKE '%Blue%'
AND
i.location='Dallas'
La variable de inventario, i
:
- se nombra en la cláusula JOIN para acceder a los datos de la subpropiedad.
- se usa en la cláusula WHERE para reducir el conjunto de datos.
- se usa en la cláusula SELECT para devolver las propiedades del inventario.
Para buscar todo el inventario de una propiedad específica en una ubicación específica, use la función siguiente. Usa la sustitución de parámetros para proporcionar la propiedad de nivel superior de un documento y el valor de subpropiedad para coincidir con una ubicación.
async function executeSqlInventory(propertyName, propertyValue, locationPropertyName, locationPropertyValue) {
// Build query
const querySpec = {
query: `select p.id, p.name, i.location, i.inventory from products p JOIN i IN p.inventory where p.${propertyName} LIKE @propertyValue AND i.${locationPropertyName}=@locationPropertyValue`,
parameters: [
{
name: "@propertyValue",
value: `${propertyValue}`,
},
{
name: "@locationPropertyValue",
value: `${locationPropertyValue}` },
],
};
// Show query
console.log(querySpec);
// Get results
const { resources } = await container.items.query(querySpec).fetchAll();
let i = 0;
// Show results of query
console.log(`Looking for ${propertyName}=${propertyValue}, ${locationPropertyName}=${locationPropertyValue}`);
for (const item of resources) {
console.log(
`${++i}: ${item.id}: '${item.name}': current inventory = ${
item.inventory
}`
);
}
}
Esta función devuelve el resultado como:
Looking for name=%Blue%, location=Dallas
1: 08225A9E-F2B3-4FA3-AB08-8C70ADD6C3C2: 'Touring-1000 Blue, 50': current inventory = 42
2: 2C981511-AC73-4A65-9DA3-A0577E386394: 'Touring-1000 Blue, 46': current inventory = 12
3: 44873725-7B3B-4B28-804D-963D2D62E761: 'Touring-1000 Blue, 60': current inventory = 83
4: 4E4B38CB-0D82-43E5-89AF-20270CD28A04: 'Touring-2000 Blue, 60': current inventory = 90
5: 5308BAE7-B0CB-4883-9A93-192CB10DC94F: 'Touring-3000 Blue, 44': current inventory = 97
Upsert para insertar o actualizar datos
El uso de upsert permite garantizar que los datos se agregan si no existen y que se actualizan si sí existen. El SDK de JavaScript devuelve statusCode, lo que indica qué acción se realizó:
Upsert de statusCode | Significado |
---|---|
201 | Insertar |
200 | Actualizar |
En el código JavaScript siguiente, se usa una función única y container.items().upsert().
// Either insert or update item
async function upsert(item) {
// Process request
const result = await container.items.upsert(item);
if(result.statusCode===201){
console.log("Inserted data");
} else if (result.statusCode===200){
console.log("Updated data");
} else {
console.log(`unexpected statusCode ${result.statusCode}`);
}
}