演習 - Cosmos DB を操作する JavaScript コードを追加する

完了

このユニットでは、LIKE、JOIN、WHERE などの SQL キーワードを使用して Cosmos SDK でデータを検索するスクリプトを作成して実行します。

コンテナー内の製品を検索するスクリプトを作成する

  1. Visual Studio Code の [ファイル] メニューで、[新しいテキスト ファイル] を選択します。

  2. [File](ファイル) メニューの [Save As](名前を付けて保存) を選択します。 2-contoso-products-find.js という名前で新しいファイルを保存します。

  3. 次の JavaScript をコピーし、そのファイルに貼り付けます。

    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. Visual Studio Code ターミナルで JavaScript ファイルを実行し、すべての自転車を検索します

    node 2-contoso-products-find.js find categoryName '%Bikes%'
    

    用語 bikes はパーセント記号 % で囲まれ、部分的な一致を示します。

    コンテナーの executeSqlFind メソッドの SQL クエリでは、LIKE キーワードとクエリ パラメーターを使用し、Bikes が含まれるあらゆる categoryName 項目が検索されます。

  5. 名前に Blue という単語が含まれるすべての製品を検索する別のクエリを実行します。

    node 2-contoso-products-find.js find name '%Blue%'
    
  6. シアトルの自転車の製品インベントリを検索する別のクエリを実行します。

    node 2-contoso-products-find.js find-inventory categoryName '%Bikes%' location Seattle
    
  7. 名前に Blue という単語が含まれるすべての製品を見つけるため、ダラスのインベントリを検索する別のクエリを実行します。

    node 2-contoso-products-find.js find-inventory name '%Blue%' location Dallas
    

コンテナーに製品をアップサートするスクリプトを作成する

  1. Visual Studio Code の [ファイル] メニューで、[新しいテキスト ファイル] を選択します。

  2. [File](ファイル) メニューの [Save As](名前を付けて保存) を選択します。 3-contoso-products-upsert.js という名前で新しいファイルを保存します。

  3. 次の JavaScript をコピーし、そのファイルに貼り付けます。

    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. 製品の新しいファイル 3-contoso-products-upsert-insert.json を作成し、次の JSON オブジェクトを貼り付けます。

    {
        "id": "123",
        "categoryName": "xyz",
        "name": "_a new item inserted"
    }
    

    ID が 123 のこのオブジェクトにはインベントリがないことに注目してください。

  5. 製品の新しいファイル 3-contoso-products-upsert-update.json を作成し、次の JSON オブジェクトを貼り付けます。

    {
      "id": "123",
      "categoryName": "xyz",
      "name": "_a new item updated",
      "inventory": [
        {
          "location": "Dallas",
          "inventory": 100
        }
      ]
    }
    

    このオブジェクトにはインベントリがあることに注目してください。

  6. Visual Studio Code ターミナルで JavaScript ファイルを実行し、新しい製品をアップサートします。

    node 3-contoso-products-upsert.js
    

    その ID を持つ製品が存在しないため、製品が挿入されます。 次に、スクリプトによってインベントリで製品が更新されます。 挿入機能と更新機能の両方で、アップサートに同じコードが使用されます。