Exercice - Ajouter du code JavaScript pour travailler avec Cosmos DB

Effectué

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

  1. Dans Visual Studio Code, dans le menu Fichier, sélectionnez Nouveau fichier texte.

  2. Dans le menu Fichier, sélectionnez Enregistrer sous. Enregistrez le nouveau fichier avec le nom 2-contoso-products-find.js.

  3. 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");
    }
    
  4. 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 inclut Bikes.

  5. 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%'
    
  6. 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
    
  7. 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

  1. Dans Visual Studio Code, dans le menu Fichier, sélectionnez Nouveau fichier texte.

  2. Dans le menu Fichier, sélectionnez Enregistrer sous. Enregistrez le nouveau fichier avec le nom 3-contoso-products-upsert.js.

  3. 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);
    
  4. 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.

  5. 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.

  6. 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.