次の方法で共有


クイックスタート: MongoDB ドライバーで Node.js 用の Azure Cosmos DB for MongoDB vCore を使用する

このクイック スタートでは、Node.jsを使用して基本的な Azure Cosmos DB for MongoDB アプリケーションをデプロイします。 Azure Cosmos DB for MongoDB 仮想コアはスキーマレス データ ストアであり、アプリケーションは MongoDB ライブラリを使用して非構造化ドキュメントをクラウドに格納できます。 Node.jsを使用して、Azure Cosmos DB リソース内でドキュメントを作成し、基本的なタスクを実行する方法について説明します。

ライブラリのソース コード | パッケージ (npm) | Azure Developer CLI

[前提条件]

  • Azure 開発者コマンドラインインターフェース

  • Docker Desktop

  • Azure サブスクリプション

    • Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
  • Node.js 22 以降

プロジェクトを初期化する

Azure Developer CLI (azd) を使用して、Azure Cosmos DB for MongoDB 仮想コア クラスターを作成し、コンテナー化されたサンプル アプリケーションをデプロイします。 サンプル アプリケーションでは、クライアント ライブラリを使って、サンプル データの管理、作成、読み取り、クエリを実行します。

  1. 空のディレクトリでターミナルを開きます。

  2. まだ認証されていない場合は、azd auth loginを使用して Azure Developer CLI に対して認証します。 ツールによって指示された手順に従って、任意の Azure 資格情報を使って CLI に対して認証します。

    azd auth login
    
  3. azd init を使用してプロジェクトを初期化します。

    azd init --template cosmos-db-mongodb-vcore-nodejs-quickstart
    
  4. 初期化中に、一意の環境名を構成します。

  5. azd upを使用してクラスターをデプロイします。 Bicep テンプレートは、サンプル Web アプリケーションもデプロイします。

    azd up
    
  6. このプロビジョニング プロセス中に、サブスクリプション、目的の場所、ターゲット リソース グループを選択します。 プロビジョニング プロセスが完了するまで待ちます。 このプロセスには 約 10 分かかる場合があります。

  7. Azure リソースのプロビジョニングが完了すると、実行中の Web アプリケーションへの URL が出力に含まれます。

    Deploying services (azd deploy)
    
      (✓) Done: Deploying service web
    - Endpoint: <https://[container-app-sub-___domain].azurecontainerapps.io>
    
    SUCCESS: Your application was provisioned and deployed to Azure in 5 minutes 0 seconds.
    
  8. コンソールで URL を使って、ブラウザーで Web アプリケーションに移動します。 実行中のアプリの出力を確認します。

実行中の Web アプリケーションのスクリーンショット。

実行中の Web アプリケーションのスクリーンショット。

クライアント ライブラリをインストールする

クライアント ライブラリは、mongodb パッケージとして npm 経由で使用できます。

  1. ターミナルを開き、/src/ts フォルダーに移動します。

    cd ./src/ts
    
  2. mongodb パッケージがまだインストールされていない場合は、npm install を使ってインストールします。

    npm install --save mongodb
    
  3. @azure/identity パッケージがまだインストールされていない場合は、npm install を使ってインストールします。

    npm install --save @azure/identity
    
  4. src/ts/package.json ファイルを開いて確認し、両方のパッケージ エントリが存在することを検証します。

  1. ターミナルを開き、/src/js フォルダーに移動します。

    cd ./src/js
    
  2. mongodb パッケージがまだインストールされていない場合は、npm install を使ってインストールします。

    npm install --save mongodb
    
  3. @azure/identity パッケージがまだインストールされていない場合は、npm install を使ってインストールします。

    npm install --save @azure/identity
    
  4. src/js/package.json ファイルを開いて確認し、両方のパッケージ エントリが存在することを検証します。

ライブラリをインポートする

次の名前空間をアプリケーション コードにインポートします。

パッケージ 情報源
TokenCredential @azure/identity Azure SDK for JavaScript
DefaultAzureCredential @azure/identity Azure SDK for JavaScript
MongoClient mongodb Node.js の公式 MongoDB ドライバー
import { DefaultAzureCredential, TokenCredential } from '@azure/identity';

import { MongoClient } from 'mongodb';

次のような必要なすべての型をアプリケーション コードにインポートしますが、これらに限定されません。

パッケージ 情報源
TokenCredential @azure/identity Azure SDK for JavaScript
DefaultAzureCredential @azure/identity Azure SDK for JavaScript
MongoClient mongodb Node.js の公式 MongoDB ドライバー
import { AccessToken, DefaultAzureCredential, TokenCredential } from '@azure/identity';

import { Collection, Db, Filter, FindCursor, MongoClient, OIDCCallbackParams, OIDCResponse, UpdateFilter, UpdateOptions, UpdateResult, WithId } from 'mongodb';

オブジェクト モデル

名前 説明
MongoClient MongoDB への接続に使用される型。
Database クラスター内のデータベースを表します。
Collection クラスター内のデータベース内のコレクションを表します。

コード例

テンプレートのサンプル コードは、cosmicworks という名前のデータベースと products という名前のコンテナーを使います。 products コレクションには、名前、カテゴリ、数量、各製品のユニークな識別子などの詳細が含まれています。 コレクションは、/category プロパティをシャード キーとして使用します。

クライアントを認証する

Azure Cosmos DB for MongoDB 仮想コアの Microsoft Entra 認証では既知の TokenCredential 型を使用できますが、カスタム トークン ハンドラーを実装する必要があります。 このサンプル実装を使用して、多くの ID の種類の標準的な Microsoft Entra 認証をサポートする MongoClient を作成できます。

  1. まず、OIDCCallbackParamsTokenCredentialを受け取り、OIDCResponseを非同期的に返すAzureIdentityTokenCallbackという名前のコールバックを定義します。

    const AzureIdentityTokenCallback = async (params: OIDCCallbackParams, credential: TokenCredential): Promise<OIDCResponse> => {
        const tokenResponse: AccessToken | null = await credential.getToken(['https://ossrdbms-aad.database.windows.net/.default']);
        return {
            accessToken: tokenResponse?.token || '',
            expiresInSeconds: (tokenResponse?.expiresOnTimestamp || 0) - Math.floor(Date.now() / 1000)
        };
    };
    
  2. クラスター名とトークン資格情報の変数を定義します。

    const clusterName: string = '<azure-cosmos-db-mongodb-vcore-cluster-name>';
    
    const credential: TokenCredential = new DefaultAzureCredential();
    
  3. クラスター名と、Azure Cosmos DB for MongoDB 仮想コアの既知のベスト プラクティス構成オプションを使用して、 MongoClient のインスタンスを構築します。 また、カスタム認証メカニズムを構成します。

    const client = new MongoClient(
        `mongodb+srv://${clusterName}.global.mongocluster.cosmos.azure.com/`, {
        connectTimeoutMS: 120000,
        tls: true,
        retryWrites: true,
        authMechanism: 'MONGODB-OIDC',
        authMechanismProperties: {
                OIDC_CALLBACK: (params: OIDCCallbackParams) => AzureIdentityTokenCallback(params, credential),
                ALLOWED_HOSTS: ['*.azure.com']
            }
        }
    );
    
  1. まず、パラメーターとトークン資格情報を受け取り、応答を非同期的に返す azureIdentityTokenCallback という名前のコールバックを定義します。

    const azureIdentityTokenCallback = async (_, credential) => {
        const tokenResponse = await credential.getToken(['https://ossrdbms-aad.database.windows.net/.default']);
    
        if (!tokenResponse || !tokenResponse.token) {
            throw new Error('Failed to retrieve a valid access token.');
        }
    
        return {
            accessToken: tokenResponse.token,
            expiresInSeconds: Math.floor((tokenResponse.expiresOnTimestamp - Date.now()) / 1000),
        };
    };
    
  2. クラスター名とトークン資格情報の変数を定義します。

    const clusterName = '<azure-cosmos-db-mongodb-vcore-cluster-name>';
    
    const credential = new DefaultAzureCredential();
    
  3. クラスター名と、Azure Cosmos DB for MongoDB 仮想コアの既知のベスト プラクティス構成オプションを使用して、 MongoClient のインスタンスを構築します。 また、カスタム認証メカニズムを構成します。

    client = new MongoClient(`mongodb+srv://${clusterName}.global.mongocluster.cosmos.azure.com/`, {
        connectTimeoutMS: 120000,
        tls: true,
        retryWrites: true,
        authMechanism: 'MONGODB-OIDC',
        authMechanismProperties: {
            OIDC_CALLBACK: (params) => azureIdentityTokenCallback(params, credential),
            ALLOWED_HOSTS: ['*.azure.com']
        }
    });
    
    await client.connect();
    

データベースの取得

このサンプルでは、Db 型の db 関数を使用して MongoClient 型のインスタンスを作成します。

const database: Db = client.db("<database-name>");
const database = client.db("<database-name>");

コレクションを取得する

このサンプルでは、Collection 型の collection 関数を使用して Db 型のインスタンスを作成します。

この関数には、インターフェイスで定義されている Product 型を使用するジェネリック パラメーターがあります。

const collection: Collection<Product> = database.collection<Product>("<collection-name>");
export interface Product {
    _id: string;
    category: string;
    name: string;
    quantity: number;
    price: number;
    clearance: boolean;
}
const collection = database.collection("<collection-name>");

ドキュメントの作成

collection.updateOne を使用してコレクション内にドキュメントを作成します。 このメソッドは "アップサート" を行い、項目が既に存在する場合は、それを効果的に置き換えます。

var document: Product = {
    _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
    category: 'gear-surf-surfboards',
    name: 'Yamba Surfboard',
    quantity: 12,
    price: 850.00,
    clearance: false
};

var query: Filter<Product> = {
    _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
    category: 'gear-surf-surfboards'
};
var payload: UpdateFilter<Product> = {
    $set: document
};
var options: UpdateOptions = {
    upsert: true
};
var response: UpdateResult<Product> = await collection.updateOne(query, payload, options);
var document = {
    _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
    category: 'gear-surf-surfboards',
    name: 'Yamba Surfboard',
    quantity: 12,
    price: 850.00,
    clearance: false
};

const query = {
    _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb',
    category: 'gear-surf-surfboards'
};
const payload = {
    $set: document
};
const options = {
    upsert: true,
    new: true
};
var response = await collection.updateOne(query, payload, options);

ドキュメントを読み取る

一意の識別子 (id) フィールドとシャード キーフィールドの両方を使って、ポイント読み取り操作を実行します。 collection.findOne を使って、特定の項目を効率的に取得できます。

var query: Filter<Product> = { 
    _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb', 
    category: 'gear-surf-surfboards' 
};

var response: WithId<Product> | null = await collection.findOne(query);
var query = { 
    _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb', 
    category: 'gear-surf-surfboards' 
};

var response = await collection.findOne(query);

ドキュメントにクエリを実行する

collection.find を使って、コンテナー内の複数の項目に対してクエリを実行します。 このクエリは、指定されたカテゴリ (シャード キー) 内のすべての項目を見つけます。

var query: Filter<Product> = { 
    category: 'gear-surf-surfboards' 
};

var response: FindCursor<WithId<Product>> = collection.find(query);
for await (const item of response) {
    // Do something with each item
}
var query = { 
    category: 'gear-surf-surfboards' 
};

var response = collection.find(query);
for await (const item of response) {
    // Do something with each item
}

ドキュメントの削除

ドキュメントを削除するには、そのドキュメントの一意識別子のフィルターを送信します。 collection.deleteOne<>を使用して、コレクションからドキュメントを非同期的に削除します。

var filter: Filter<Product> = { 
    _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
};

await collection.deleteOne(filter);
const filter = {
    _id: 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb'
};

await collection.deleteOne(filter);

データを調査する

Azure Cosmos DB の Visual Studio Code 拡張機能を使用して、MongoDB 仮想コア データを探索します。 次のようなコア データベース操作を実行できます。ただし、これらに限定されません:

  • スクラップブックまたはクエリ エディターを使用したクエリの実行
  • ドキュメントの変更、更新、作成、および削除
  • 他のソースからのデータの一括インポート
  • データベースとコレクションの管理

詳細については、「 Visual Studio Code 拡張機能を使用して Azure Cosmos DB for MongoDB 仮想コア データを探索する方法」を参照してください。

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

サンプル アプリケーションまたはリソースが不要になったら、対応するデプロイとすべてのリソースを削除します。

azd down --force