クイック スタート - .Node.js 用の Azure Cosmos DB for NoSQ クライアント ライブラリ

適用対象: NoSQL

JavaScript 用の Azure Cosmos DB クライアント ライブラリを使用して、アカウント内にデータベース、コンテナー、項目を作成します。 以下の手順に従って、パッケージをインストールし、基本タスクのコード例を試してみましょう。

注意

コード スニペットの例は、Node.js プロジェクトとして GitHub 上で使用できます。

前提条件

前提条件のチェック

  • ターミナルまたはコマンド ウィンドウで node --version を実行して、Node.js バージョンが現在の長期サポート (LTS) バージョンの 1 つであることを確認します。
  • az --version (Azure CLI) または Get-Module -ListAvailable AzureRM (Azure PowerShell) を実行して、適切な Azure コマンド ライン ツールがインストールされていることを確認します。

設定

このセクションでは、Azure Cosmos アカウントを作成し、JavaScript 用 Azure Cosmos DB SQL API クライアント ライブラリを使用してリソースを管理するプロジェクトを設定する手順について説明します。

Azure Cosmos DB アカウントを作成する

ヒント

Azure サブスクリプションがない場合。 Azure Cosmos DB を無料で試すことができます。クレジット カードは必要ありません。 無料試用版を使用してアカウントを作成する場合は、「新しい JavaScript アプリを作成する」セクションに進むことができます。

このクイック スタートでは、NoSQL 用 API を使用して Azure Cosmos DB アカウントを 1 つ作成します。

ヒント

このクイック スタートでは、リソース グループ名 msdocs-cosmos-quickstart-rg を使用することをお勧めします。

  1. Azure portal にサインインします。

  2. Azure portal のメニューまたは [ホーム] ページで、 [リソースの作成] を選択します。

  3. [新規] ページで、 [Azure Cosmos DB] を検索して選択します。

  4. [API オプションの選択] ページで、[NoSQL] セクション内の [作成] オプションを選択します。 Azure Cosmos DB には、NoSQL、MongoDB、PostgreSQL、Apache Cassandra、Apache Gremlin、Table の 6 つの API があります。 NoSQL 用 API に関する詳細を参照してください

    Azure Cosmos DB の [API オプションの選択] ページのスクリーンショット。

  5. [Azure Cosmos DB アカウントの作成] ページで、次の情報を入力します。

    設定 説明
    サブスクリプション サブスクリプション名 この Azure Cosmos アカウントに使用する Azure サブスクリプションを選択します。
    リソース グループ リソース グループ名 リソース グループを選択するか、 [新規作成] を選択し、新しいリソース グループの一意の名前を入力します。
    アカウント名 一意の名前 自分の Azure Cosmos アカウントを識別するための名前を入力します。 名前は、サフィックスが documents.azure.com の完全修飾ドメイン名 (FQDN) の一部として使用されるため、グローバルに一意である必要があります。 名前に含めることができるのは、英小文字、数字、ハイフン (-) のみです。 また、名前の長さは 3 文字から 44 文字である必要があります。
    場所 ユーザーに最も近いリージョン Azure Cosmos DB アカウントをホストする地理的な場所を選択します。 データに最も高速にアクセスできるよう、お客様のユーザーに最も近い場所を使用します。
    容量モード プロビジョニング スループットまたはサーバーレス プロビジョニング スループット モードでアカウントを作成するには、 [Provisioned throughput](プロビジョニング スループット) を選択します。 サーバーレス モードでアカウントを作成するには、 [サーバーレス] を選択します。
    Apply Azure Cosmos DB free tier discount (Azure Cosmos DB Free レベル割引を適用する) [適用] または [適用しない] Azure Cosmos DB の Free レベルを有効にする Azure Cosmos DB Free レベルのアカウントでは、最初の 1000 RU/s と 25 GB のストレージを無料でご利用いただけます。 Free レベルの詳細を確認してください。

    Note

    Azure サブスクリプションにつき所有できる Free レベルの Azure Cosmos DB アカウントは 1 つまでです。また、アカウントの作成時にオプトインする必要があります。 Free レベルの割引を適用するオプションが表示されない場合は、サブスクリプション内の別のアカウントが Free レベルで既に有効になっていることを意味します。

    NoSQL 用 API の新しいアカウント ページのスクリーンショット。

  6. [確認と作成] を選択します。

  7. 指定した設定を確認し、[作成] を選択します。 アカウントの作成には数分かかります。 ポータル ページに "デプロイが完了しました" と表示されるまで待ってから移動します。

  8. [リソースに移動] を選択し、Azure Cosmos DB アカウント ページに移動します。

    NoSQL 用 API リソースのデプロイ ページのスクリーンショット。

  9. NoSQL 用 API アカウント ページで、[キー] ナビゲーション メニュー オプションを選択します。

    NoSQL 用 API アカウント ページのスクリーンショット。ナビゲーション メニューで [キー] オプションが強調表示されています。

  10. URI フィールドと PRIMARY KEY フィールドの値を記録します。 これらの値は、後の手順で使用します。

    NoSQL 用 API アカウントの各種資格情報を含む [キー] ページのスクリーンショット。

新しい JavaScript プロジェクトを作成する

  1. 任意のターミナルを使用して、空のフォルダーに新しい Node.js アプリケーションを作成します。

    npm init -y
    
  2. "type": "module", エントリを追加して、ES6 モジュールを使用するように package.json ファイルを編集します。 この設定により、コードで最新の async/await 構文を使用できます。

    {
      "name": "azure-cosmos-db-sql-api-quickstart",
      "version": "1.0.0",
      "description": "Azure Cosmos DB for Core (SQL) quickstart with JavaScript",
      "main": "index",
      "type": "module",
      "scripts": {
        "start": "node index.js",
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [
        "cosmos",
        "quickstart"
      ],
      "author": "diberry",
      "license": "MIT",
      "dependencies": {
        "@azure/cosmos": "^3.17.0",
        "dotenv": "^16.0.2"
      }
    }
    

パッケージをインストールする

  1. @azure/cosmos および @azure/identity npm パッケージを Node.js プロジェクトに追加します。

    npm install @azure/cosmos
    npm install @azure/identity
    
  2. .env ファイルから環境変数を読み取るための dotenv npm パッケージを追加します。

    npm install dotenv
    

環境変数を構成する

コード内で URI 値と PRIMARY KEY 値を使用するには、アプリケーションを実行しているローカル コンピューター上の新しい環境変数に保持します。 環境変数を設定するには、任意のターミナルを使用して次のコマンドを実行します。

$env:COSMOS_ENDPOINT = "<cosmos-account-URI>"
$env:COSMOS_KEY = "<cosmos-account-PRIMARY-KEY>"

オブジェクト モデル

アプリケーションのビルドを開始する前に、Azure Cosmos DB のリソースの階層について説明します。 Azure Cosmos DB には、リソースの作成とアクセスに使用される特定のオブジェクト モデルがあります。 Azure Cosmos DB は、アカウント、データベース、コンテナー、および項目で構成される階層内にリソースを作成します。

アカウント、データベース、コンテナー、項目を含む Azure Cosmos DB 階層の図。

上部に Azure Cosmos DB アカウントを示す階層図。 アカウントには 2 つの子データベース ノードがあります。 一方のデータベース ノードには、2 つの子コンテナー ノードが含まれています。 もう一方のデータベース ノードには、1 つの子コンテナー ノードが含まれています。 その 1 つのコンテナー ノードには、3 つの子項目ノードがあります。

さまざまなリソースの階層の詳細については、Azure Cosmos DB のデータベース、コンテナー、および項目の操作に関する記事を参照してください。

これらのリソースとやり取りするには、以下の JavaScript クラスを使用します。

  • CosmosClient - このクラスは、Azure Cosmos DB サービスのクライアント側の論理表現を提供します。 このクライアント オブジェクトは、サービスに対する要求の構成と実行に使用されます。
  • Database - このクラスは、サービスに存在する (または、まだ存在しない) 場合があるデータベースへの参照です。 データベースへのアクセスまたはデータベースに対する操作の実行を試みると、データベースはサーバー側で検証されます。
  • Container - このクラスは、まだサービスに存在しない可能性があるコンテナーへの参照です。 コンテナーを操作しようとすると、コンテナーはサーバー側で検証されます。
  • SqlQuerySpec - このインターフェイスは、SQL クエリと任意のクエリ パラメーターを表します。
  • QueryIterator<> - このクラスは、結果の現在のページを追跡し、結果の新しいページを取得できる反復子を表します。
  • FeedResponse<> - このクラスは、反復子からの応答の 1 ページを表します。

コード例

この記事で説明されているサンプル コードでは、products という名前のコンテナーを使用して cosmicworks という名前のデータベースを作成します。 products テーブルには、名前、カテゴリ、数量、販売インジケーターなどの製品の詳細が含まれるように設計されています。 各製品には、一意の識別子も含まれています。

このサンプル コードでは、コンテナーは論理パーティション キーとしてカテゴリを使用します。

クライアントを認証する

ほとんどの Azure サービスに対するアプリケーション要求は、承認される必要があります。 コード内の Azure サービスに対してパスワードレス接続を実装するには、Azure ID クライアント ライブラリによって提供される DefaultAzureCredential クラスを使用する方法お勧めします。

パスワード、接続文字列、その他の資格情報を使用して、Azure サービスへの要求を直接承認することもできます。 ただし、この方法は慎重に使用する必要があります。 開発者は、安全でない場所にこれらのシークレットを公開しないように注意する必要があります。 パスワードまたはシークレット キーへのアクセス権を取得したユーザーは、誰でも認証を受けることができます。 DefaultAzureCredential はアカウント・キーよりも管理しやすく、セキュリティが優れており、パスワードレス認証が可能になります。 両方のオプションの例を次に示します。

DefaultAzureCredential は、.NET 用 Azure ID クライアント ライブラリによって提供されるクラスです。 DefaultAzureCredential の詳細については、DefaultAzureCredential の概要を参照してください。 DefaultAzureCredential は複数の認証方法をサポートしており、実行時に使用する方法が決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカルと運用環境) で異なる認証方法をアプリに使用できます。

たとえば、ローカルでの開発時には Visual Studio サインイン資格情報を使用してアプリを認証し、それが Azure にデプロイされたらマネージド ID を使用できます。 この移行のためにコードを変更する必要はありません。

パスワードレス認証を使用してローカルで開発する場合は、Cosmos DB に接続するユーザー アカウントに、データ操作を実行するための適切なアクセス許可をもつロールが割り当てられていることを確認します。 現在、Azure Cosmos DB for NoSQL にはデータ操作用の組み込みロールは含まれていませんが、Azure CLI または PowerShell を使用して独自のロールを作成できます。

ロールは、読み取り、書き込み、削除など、アクセス許可、またはユーザーが実行を許可されたアクションのコレクションで構成されます。 ロールベースのアクセス制御 (RBAC) の構成の詳細については、Cosmos DB セキュリティ構成に関するドキュメントを参照してください。

カスタム ロールを作成する

  1. az role definition create コマンドを使用して、ロールを作成します。 Cosmos DB アカウント名とリソース グループを渡し、その後にカスタム ロールを定義する JSON の本文を渡します。 次の例では、Cosmos DB コンテナー内の項目の読み取りと書き込みを行うアクセス許可を持つ PasswordlessReadWrite という名前のロールを作成します。 ロールのスコープも / を使用してアカウント レベルに設定されます。

    az cosmosdb sql role definition create \
        --account-name <cosmosdb-account-name> \
        --resource-group  <resource-group-name> \
        --body '{
        "RoleName": "PasswordlessReadWrite",
        "Type": "CustomRole",
        "AssignableScopes": ["/"],
        "Permissions": [{
            "DataActions": [
                "Microsoft.DocumentDB/databaseAccounts/readMetadata",
                "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*",
                "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*"
            ]
        }]
    }'
    
  2. コマンドが完了したら、name フィールドから ID 値をコピーし、後で使用できるように任意の場所に貼り付けます。

  3. 作成したロールを、Cosmos DB に接続するユーザー アカウントまたはサービス プリンシパルに割り当てます。 ローカル開発の間、これは通常、Visual Studio または Azure CLI などの開発ツールにログインする独自のアカウントになります。 az ad user コマンドを使用して、アカウントの詳細を取得します。

    az ad user show --id "<your-email-address>"
    
  4. id プロパティの値を結果からコピーし、後で使用するために任意の場所に貼り付けます。

  5. az cosmosdb sql role assignment create コマンドと前にコピーした ID を使用して、作成したカスタム ロールをユーザー アカウントに割り当てます。

    az cosmosdb sql role assignment create \
        --account-name <cosmosdb-account-name> \
        --resource-group  <resource-group-name> \
        --scope "/" \
        --principal-id <your-user-id> \
        --role-definition-id <your-custom-role-id> 
    

DefaultAzureCredential を使用して認証する

ローカル開発には、ロールを割り当てたのと同じ Azure AD アカウントで認証を受けるようにしてください。 Azure CLI や Azure PowerShell などの一般的な開発ツールを使用して認証できます。 認証に使用できる開発ツールは、言語によって異なります。

Azure CLI で次のコマンドを使って Azure にサインインします。

az login

プロジェクト ディレクトリから、index.js ファイルを開きます。 エディターで、Cosmos DB を操作し、Azure に対する認証を行う npm パッケージを追加します。 @azure/identity パッケージから DefaultAzureCredential を使用して、Cosmos DB for NoSQL に対する認証を行います。 DefaultAzureCredential は、前にサインインしたアカウントを自動的に検出して使います。

// Get Identity Client
import { DefaultAzureCredential } from "@azure/identity";

// Get Cosmos Client
import { CosmosClient } from "@azure/cosmos";

Cosmos DB エンドポイントを指定する環境変数を作成します。

// Provide required connection from environment variables
// Endpoint format: https://YOUR-RESOURCE-NAME.documents.azure.com:443/
const endpoint = process.env.COSMOS_ENDPOINT;

データベース名とコンテナー名の定数を作成します。

// Set Database name and container name with unique timestamp
const databaseName = `cosmicworks`;
const containerName = `products`;

DefaultAzureCredential オブジェクトとエンドポイントを使用して、CosmosClient クラス コンストラクターの新しいクライアント インスタンスを作成します。

// Authenticate to Azure Cosmos DB
const cosmosClient = new CosmosClient({ 
    endpoint, 
    aadCredentials: new DefaultAzureCredential() 
});

データベースを作成する

@azure/cosmos クライアント ライブラリを使用すると、Azure RBAC を使用して "データ" 操作を実行できます。 ただし、データベースの作成や削除などの "管理" 操作を認証するには、次のいずれかのオプションを使用して RBAC を使用する必要があります。

Azure CLI のアプローチは、このクイックスタートとパスワードレス アクセスに使用されます。 az cosmosdb sql database create コマンドを使用して、Cosmos DB for NoSQL データベースを作成します。

# Create a SQL API database `
az cosmosdb sql database create `
    --account-name <cosmos-db-account-name> `
    --resource-group <resource-group-name> `
    --name cosmicworks

データベースを作成するコマンド ラインは PowerShell についてのもので、わかりやすくするために複数行で示しています。 その他の種類のシェルの場合は、必要に応じて行連結文字を変更してください。 たとえば、Bash の場合は、円記号 ("\") を使用します。 または、連結文字を削除し、コマンドを 1 行で入力します。

コンテナーを作成する

Microsoft.Azure.Cosmos クライアント ライブラリを使用すると、Azure RBAC を使用して "データ" 操作を実行できます。 ただし、データベースの作成や削除などの "管理" 操作を認証するには、次のいずれかのオプションを使用して RBAC を使用する必要があります。

この例では、Azure CLI アプローチを使用します。 az cosmosdb sql container create コマンドを使用して、Cosmos DB コンテナーを作成します。

# Create a SQL API container
az cosmosdb sql container create `
    --account-name <cosmos-db-account-name> `
    --resource-group <resource-group-name> `
    --database-name cosmicworks `
    --partition-key-path "/categoryId" `
    --name products

コンテナーを作成するコマンド ラインは PowerShell についてのもので、わかりやすくするために複数行で示しています。 その他の種類のシェルの場合は、必要に応じて行連結文字を変更してください。 たとえば、Bash の場合は、円記号 ("\") を使用します。 または、連結文字を削除し、コマンドを 1 行で入力します。 Bash の場合は、コマンドの前に MSYS_NO_PATHCONV=1 を追加して、Bash でパーティション キー パラメーターが正しく処理されるようにする必要もあります。

リソースが作成されたら、Microsoft.Azure.Cosmos クライアント ライブラリのクラスを使用してデータベースに接続し、クエリを実行します。

項目を作成する

次のコードを追加して、データ セットを提供します。 各 "製品" には、一意の ID、名前、カテゴリ ID (パーティション キーとして使用)、その他のフィールドがあります。

// Data items
const items = [
    {
        "id": "08225A9E-F2B3-4FA3-AB08-8C70ADD6C3C2",
        "categoryId": "75BF1ACB-168D-469C-9AA3-1FD26BB4EA4C",
        "categoryName": "Bikes, Touring Bikes",
        "sku": "BK-T79U-50",
        "name": "Touring-1000 Blue, 50",
        "description": "The product called \"Touring-1000 Blue, 50\"",
        "price": 2384.0700000000002,
        "tags": [
            {
                "_id": "27B7F8D5-1009-45B8-88F5-41008A0F0393",
                "name": "Tag-61"
            }
        ]
    },
    {
        "id": "2C981511-AC73-4A65-9DA3-A0577E386394",
        "categoryId": "75BF1ACB-168D-469C-9AA3-1FD26BB4EA4C",
        "categoryName": "Bikes, Touring Bikes",
        "sku": "BK-T79U-46",
        "name": "Touring-1000 Blue, 46",
        "description": "The product called \"Touring-1000 Blue, 46\"",
        "price": 2384.0700000000002,
        "tags": [
            {
                "_id": "4E102F3F-7D57-4CD7-88F4-AC5076A42C59",
                "name": "Tag-91"
            }
        ]
    },
    {
        "id": "0F124781-C991-48A9-ACF2-249771D44029",
        "categoryId": "56400CF3-446D-4C3F-B9B2-68286DA3BB99",
        "categoryName": "Bikes, Mountain Bikes",
        "sku": "BK-M68B-42",
        "name": "Mountain-200 Black, 42",
        "description": "The product called \"Mountain-200 Black, 42\"",
        "price": 2294.9899999999998,
        "tags": [
            {
                "_id": "4F67013C-3B5E-4A3D-B4B0-8C597A491EB6",
                "name": "Tag-82"
            }
        ]
    }
];

ループで Container.Items.create を呼び出して、コンテナーにいくつかの項目を作成します。

// Create all items
for (const item of items) {
    
    const { resource } = await container.items.create(item);
    console.log(`'${resource.name}' inserted`);
}

アイテムを取得する

Azure Cosmos DB では、一意識別子 (id) フィールドとパーティション キー フィールドの両方を使用して、ポイント読み取り操作を実行できます。 SDK では、両方の値を渡して Container.item().read を呼び出し、項目を返します。

パーティション キーはコンテナーに固有です。 この Contoso Products コンテナーでは、カテゴリ ID categoryId がパーティション キーとして使用されます。

// Read item by id and partitionKey - least expensive `find`
const { resource } = await container.item(items[0].id, items[0].categoryId).read();
console.log(`${resource.name} read`);

クエリ項目

次のコードを追加して、特定のフィルターに一致するすべての項目のクエリを実行します。 パラメーター化クエリ式を作成し、Container.Items.query メソッドを呼び出します。 このメソッドは、結果のページを管理する QueryIterator を返します。 次に、whilefor のループの組み合わせを使用して結果のページの fetchNextFeedResponse として実行し、個々のデータ オブジェクトを反復処理します。

このクエリはプログラムによって SELECT * FROM todo t WHERE t.partitionKey = 'Bikes, Touring Bikes' に構成されます。

// Query by SQL - more expensive `find`
// find all items with same categoryId (partitionKey)
const querySpec = {
    query: "select * from products p where p.categoryId=@categoryId",
    parameters: [
        {
            name: "@categoryId",
            value: items[2].categoryId
        }
    ]
};

// Get items 
const { resources } = await container.items.query(querySpec).fetchAll();

for (const item of resources) {
    console.log(`${item.id}: ${item.name}, ${item.sku}`);
}

FeedResponse から返されたこのデータを "項目" として使用する場合は、Container.Items.read メソッドを使用して Item を作成する必要があります。

項目を削除する

ID とパーティション キーを使用して項目を取得し、削除するために必要な次のコードを追加して、項目を削除します。 この例では、Container.Item.delete メソッドを使用して項目を削除します。

// Delete item
const { statusCode } = await container.item(items[2].id, items[2].categoryId).delete();
console.log(`${items[2].id} ${statusCode==204 ? `Item deleted` : `Item not deleted`}`);

コードの実行

このアプリは、AZURE Cosmos DB SQL API データベースとコンテナーを作成します。 次に、この例では項目を作成し、その項目を読み取ります。 最後に、この例では、特定のカテゴリに一致する項目のみを返すクエリを発行します。 この例では、各ステップで、実行したステップに関するメタデータをコンソールに出力します。

アプリを実行するには、ターミナルを使用してアプリケーション ディレクトリに移動し、アプリケーションを実行します。

node index.js

アプリの出力は次の例のようになります。

contoso_1663276732626 database ready
products_1663276732626 container ready
'Touring-1000 Blue, 50' inserted
'Touring-1000 Blue, 46' inserted
'Mountain-200 Black, 42' inserted
Touring-1000 Blue, 50 read
08225A9E-F2B3-4FA3-AB08-8C70ADD6C3C2: Touring-1000 Blue, 50, BK-T79U-50
2C981511-AC73-4A65-9DA3-A0577E386394: Touring-1000 Blue, 46, BK-T79U-46
0F124781-C991-48A9-ACF2-249771D44029 Item deleted

リソースをクリーンアップする

NoSQL 用 API アカウントが不要になったら、対応するリソース グループを削除できます。

  1. Azure portal で先ほど作成したリソース グループに移動します。

    ヒント

    このクイックスタートでは、msdocs-cosmos-quickstart-rg という名前にするようにお勧めしました。

  2. [リソース グループの削除] を選択します。

    リソース グループのナビゲーション バーにある [リソースグループの削除] オプションのスクリーンショット。

  3. [削除しますか] のダイアログで、リソース グループの名前を入力し、[削除] を選択します。

    リソース グループの [削除の確認] ページのスクリーンショット。

次の手順

このクイックスタートでは、Azure Cosmos DB SQL API アカウントを作成し、JavaScript SDK を使用してデータベースとコンテナーを作成する方法を説明しました。 SDK の詳細を確認して、より多くのデータをインポートし、複雑なクエリを実行し、Azure Cosmos DB SQL API リソースを管理できるようになりました。