Exercice - Ajouter du code JavaScript pour travailler avec Cosmos DB
Dans cette leçon, vous créez et exécutez des scripts, qui utilisent des mots clés SQL tels que LIKE, JOIN et WHERE pour trouver des données avec le SDK Cosmos.
Créez le script pour trouver des produits dans le conteneur
Dans Visual Studio Code, dans le menu Fichier, sélectionnez Nouveau fichier texte.
Dans le menu Fichier, sélectionnez Enregistrer sous. Enregistrez le nouveau fichier avec le nom 2-contoso-products-find.js.
Copiez le code JavaScript suivant et collez-le dans ce fichier :
import * as path from "path"; import { promises as fs } from "fs"; import { fileURLToPath } from "url"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); // Get environment variables from .env import * as dotenv from "dotenv"; dotenv.config(); // Get Cosmos Client import { CosmosClient } from "@azure/cosmos"; // Provide required connection from environment variables const cosmosSecret = process.env.COSMOS_CONNECTION_STRING; // Authenticate to Azure Cosmos DB const cosmosClient = new CosmosClient(cosmosSecret); // Set Database name and container name const databaseName = process.env.COSMOS_DATABASE_NAME; const containerName = process.env.COSMOS_CONTAINER_NAME; // Get Container const container = await cosmosClient .database(databaseName) .container(containerName); // 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}`); } } // Find inventory of products with property/value and location 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 }` ); } } // Example queries /* // find all bikes based on partial match to property value node 2-contoso-products-find.js find categoryName '%Bikes%' node 2-contoso-products-find.js find name '%Blue%' // find inventory at location on partial match to property value and specific location node 2-contoso-products-find.js find-inventory categoryName '%Bikes%' location Seattle node 2-contoso-products-find.js find-inventory name '%Blue%' location Dallas */ const args = process.argv; if (args && args[2] == "find") { await executeSqlFind(args[3], args[4]); } else if (args && args[2] == "find-inventory") { await executeSqlInventory(args[3], args[4], args[5], args[6]); } else { console.log("products: no args used"); }
Dans le terminal Visual Studio Code, exécutez le fichier JavaScript pour trouver tous les vélos :
node 2-contoso-products-find.js find categoryName '%Bikes%'
Le terme
bikes
est encadré par des signes de pourcentage,%
, ce qui indique une correspondance partielle.La requête SQL dans la méthode
executeSqlFind
pour le conteneur utilise le mot clé LIKE et les paramètres de requête pour trouver tous les éléments avec un categoryName qui inclutBikes
.Exécutez une autre requête pour trouver tous les produits avec le mot
Blue
dans le nom.node 2-contoso-products-find.js find name '%Blue%'
Exécutez une autre requête pour trouver l’inventaire des produits pour les vélos à Seattle.
node 2-contoso-products-find.js find-inventory categoryName '%Bikes%' location Seattle
Exécutez une autre requête pour trouver l’inventaire de tous les produits portant le mot
Blue
dans le nom de Dallas.node 2-contoso-products-find.js find-inventory name '%Blue%' location Dallas
Créez le script pour faire un upsert des produits sur un conteneur
Dans Visual Studio Code, dans le menu Fichier, sélectionnez Nouveau fichier texte.
Dans le menu Fichier, sélectionnez Enregistrer sous. Enregistrez le nouveau fichier avec le nom 3-contoso-products-upsert.js.
Copiez le code JavaScript suivant et collez-le dans ce fichier :
import * as path from "path"; import { promises as fs } from "fs"; import { fileURLToPath } from "url"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); // Get environment variables from .env import * as dotenv from "dotenv"; dotenv.config(); // Get Cosmos Client import { CosmosClient } from "@azure/cosmos"; // Provide required connection from environment variables const cosmosSecret = process.env.COSMOS_CONNECTION_STRING; // Authenticate to Azure Cosmos DB const cosmosClient = new CosmosClient(cosmosSecret); // Set Database name and container name const databaseName = process.env.COSMOS_DATABASE_NAME; const containerName = process.env.COSMOS_CONTAINER_NAME; // Get Container const container = await cosmosClient.database(databaseName).container(containerName); // Either insert or update item async function upsert(fileAndPathToJson, encoding='utf-8') { // Get item from file const data = JSON.parse(await fs.readFile(path.join(__dirname, fileAndPathToJson), encoding)); // Process request // result.resource is the returned item const result = await container.items.upsert(data); if(result.statusCode===201){ console.log("Inserted data"); } else if (result.statusCode===200){ console.log("Updated data"); } else { console.log(`unexpected statusCode ${result.statusCode}`); } } // Insert data - statusCode = 201 await upsert('./3-contoso-products-upsert-insert.json'); // Update data - statusCode = 200 await upsert('./3-contoso-products-upsert-update.json'); // Get item from container and partition key const { resource } = await container.item("123", "xyz").read(); // Show final item console.log(resource);
Créez un nouveau fichier pour le produit, 3-contoso-products-upsert-insert.json, puis collez l’objet JSON suivant.
{ "id": "123", "categoryName": "xyz", "name": "_a new item inserted" }
Notez que cet objet avec l’ID
123
n’a pas d’inventaire.Créez un nouveau fichier pour le produit, 3-contoso-products-upsert-update.json, puis collez l’objet JSON suivant.
{ "id": "123", "categoryName": "xyz", "name": "_a new item updated", "inventory": [ { "location": "Dallas", "inventory": 100 } ] }
Notez que cet objet possède un inventaire.
Dans le terminal Visual Studio Code, exécutez le fichier JavaScript pour faire un upsert du nouveau produit.
node 3-contoso-products-upsert.js
Comme le produit portant cet identifiant n’existe pas, le produit est inséré. Ensuite, le script met à jour le produit avec l’inventaire. L’insertion et la fonctionnalité de mise à jour utilisent le même code pour faire un upsert.