演習 - Cosmos DB を操作する JavaScript コードを追加する
このユニットでは、LIKE、JOIN、WHERE などの SQL キーワードを使用して Cosmos SDK でデータを検索するスクリプトを作成して実行します。
コンテナー内の製品を検索するスクリプトを作成する
Visual Studio Code の [ファイル] メニューで、[新しいテキスト ファイル] を選択します。
[File](ファイル) メニューの [Save As](名前を付けて保存) を選択します。 2-contoso-products-find.js という名前で新しいファイルを保存します。
次の 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"); }
Visual Studio Code ターミナルで JavaScript ファイルを実行し、すべての自転車を検索します。
node 2-contoso-products-find.js find categoryName '%Bikes%'
用語
bikes
はパーセント記号%
で囲まれ、部分的な一致を示します。コンテナーの
executeSqlFind
メソッドの SQL クエリでは、LIKE キーワードとクエリ パラメーターを使用し、Bikes
が含まれるあらゆる categoryName 項目が検索されます。名前に
Blue
という単語が含まれるすべての製品を検索する別のクエリを実行します。node 2-contoso-products-find.js find name '%Blue%'
シアトルの自転車の製品インベントリを検索する別のクエリを実行します。
node 2-contoso-products-find.js find-inventory categoryName '%Bikes%' location Seattle
名前に
Blue
という単語が含まれるすべての製品を見つけるため、ダラスのインベントリを検索する別のクエリを実行します。node 2-contoso-products-find.js find-inventory name '%Blue%' location Dallas
コンテナーに製品をアップサートするスクリプトを作成する
Visual Studio Code の [ファイル] メニューで、[新しいテキスト ファイル] を選択します。
[File](ファイル) メニューの [Save As](名前を付けて保存) を選択します。 3-contoso-products-upsert.js という名前で新しいファイルを保存します。
次の 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);
製品の新しいファイル 3-contoso-products-upsert-insert.json を作成し、次の JSON オブジェクトを貼り付けます。
{ "id": "123", "categoryName": "xyz", "name": "_a new item inserted" }
ID が
123
のこのオブジェクトにはインベントリがないことに注目してください。製品の新しいファイル 3-contoso-products-upsert-update.json を作成し、次の JSON オブジェクトを貼り付けます。
{ "id": "123", "categoryName": "xyz", "name": "_a new item updated", "inventory": [ { "location": "Dallas", "inventory": 100 } ] }
このオブジェクトにはインベントリがあることに注目してください。
Visual Studio Code ターミナルで JavaScript ファイルを実行し、新しい製品をアップサートします。
node 3-contoso-products-upsert.js
その ID を持つ製品が存在しないため、製品が挿入されます。 次に、スクリプトによってインベントリで製品が更新されます。 挿入機能と更新機能の両方で、アップサートに同じコードが使用されます。