Agregar código JavaScript para usarlo con Cosmos DB

Completado

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}`);
  }
}