Azure Cosmos DB の JavaScript クエリ API

Azure Cosmos DB の NoSQL 用 API を使用したクエリの発行に加えて、 Azure Cosmos DB サーバー側 SDK には、Azure Cosmos DB ストアド プロシージャとトリガーで最適化されたクエリを実行するための JavaScript インターフェイスが用意されています。 この JavaScript インターフェイスを使用するために SQL 言語を認識する必要はありません。 JavaScript クエリ API を使用すると、ECMAScript5 の配列組み込みと Lodash などの一般的な JavaScript ライブラリに似た構文を使用して、述語関数を関数呼び出しのシーケンスに渡すことで、プログラムによってクエリを作成できます。 クエリは JavaScript ランタイムによって解析され、Azure Cosmos DB インデックスを使用して効率的に実行されます。

サポートされている JavaScript 関数

Function Description
chain() ... .value([callback] [, options]) value() で終了する必要があるチェーン呼び出しを開始します。
filter(predicateFunction [, options] [, callback]) 入力ドキュメントを結果セットにフィルター処理するために、true/false を返す述語関数を使用して入力をフィルター処理します。 この関数は、SQL の WHERE 句と同様に動作します。
flatten([isShallow] [, options] [, callback]) 各入力項目の配列を結合して 1 つの配列にフラット化します。 この関数は、LINQ の SelectMany と同様に動作します。
map(transformationFunction [, options] [, callback]) 各入力項目を JavaScript オブジェクトまたは値にマップする変換関数を指定して、プロジェクションを適用します。 この関数は、SQL の SELECT 句と同様に動作します。
pluck([propertyName] [, options] [, callback]) この関数は、各入力項目から 1 つのプロパティの値を抽出するマップのショートカットです。
sortBy([predicate] [, options] [, callback]) 指定された述語を使用して、入力ドキュメント ストリーム内のドキュメントを昇順で並べ替えて、新しいドキュメント セットを生成します。 この関数は、SQL の ORDER BY 句と同様に動作します。
sortByDescending([predicate] [, options] [, callback]) 指定された述語を使用して、入力ドキュメント ストリーム内のドキュメントを降順に並べ替えて、新しいドキュメント セットを生成します。 この関数は、SQL の ORDER BY x DESC 句と同様に動作します。
unwind(collectionSelector, [resultSelector], [options], [callback]) 内部配列を使用して自己結合を実行し、両側からの結果をタプルとして結果プロジェクションに追加します。 たとえば、person ドキュメントを person.pets と結合すると、[person, pet] タプルが生成されます。 これは、.NET LINQ の SelectMany に似ています。

述語関数またはセレクター関数内に含まれる場合、次の JavaScript コンストラクトは、Azure Cosmos DB インデックスで直接実行するように自動的に最適化されます。

  • 単純な演算子: =+-*/%|^&==!====!==<><=>=||&&<<>>>>>~
  • オブジェクト リテラルを含むリテラル: {}
  • var、return

次の JavaScript コンストラクトは、Azure Cosmos DB インデックス用に最適化されていません。

  • 制御フロー: ifforwhile
  • 関数呼び出し

詳細については、 Azure Cosmos DB サーバー側の JavaScript ドキュメントを参照してください。

SQL から JavaScript へのチート シート

次の表に、さまざまな SQL クエリと、対応する JavaScript クエリを示します。 SQL クエリと同様に、プロパティ ( item.id など) では大文字と小文字が区別されます。

注

__ (二重アンダースコア) は、JavaScript クエリ API を使用するときに getContext().getCollection() するエイリアスです。

SQL JavaScript クエリ API Description
選択*
FROM ドキュメント
__.map(function(doc) {
    ドキュメントを返します。
});
すべてのドキュメントは、(継続トークンを用いてページ分割された) 結果としてそのまま表示されます。
選択
   docs.id.
   docs.message AS メッセージ、
   ドキュメント.アクション
FROM ドキュメント
__.map(function(doc) {
    return {
        id: doc.id、
        msg: doc.message,
        アクション:ドキュメント.アクション
    };
});
ID、メッセージ(msgにエイリアスされている)、アクションをすべてのドキュメントから投影します。
選択*
FROM ドキュメント
WHERE
   docs.id="X998_Y998"
__.filter(function(doc) {
    return doc.id ==="X998_Y998";
});
id = "X998_Y998" という条件を持つドキュメントのクエリ。
選択*
FROM ドキュメント
WHERE
   ARRAY_CONTAINS(docs.タグ、123)
__.filter(function(x) {
    return x.Tags && x.Tags.indexOf(123) -1;
});
Tags プロパティを持つドキュメントに対するクエリで、Tags が値 123 を含む配列であることを示します。
SELECT
   docs.id.
   docs.message AS msg
FROM ドキュメント
WHERE
   docs.id="X998_Y998"
__.chain()
    .filter(function(doc) {
        return doc.id ==="X998_Y998";
    })
    .map(function(doc) {
       return {
            id: doc.id、
            msg: doc.message
       };
    })
。Value();
述語 id = "X998_Y998" を持つドキュメントに対してクエリを実行し、id とメッセージ(msg としてエイリアス化される)を投影します。
SELECT VALUE タグ
FROM ドキュメント
JOIN タグ IN docs.Tags
ORDER BY docs._ts (並べ替えの基準はdocs._ts)
__.chain()
    .filter(function(doc) {
        doc.Tags が存在し、かつ Array.isArray(doc.Tags) であるかを判定して返します;
    })
    .sortBy(function(doc) {
        return doc._ts;
    })
    .pluck("タグ")
    .flatten()
    .value()
配列プロパティタグを持つドキュメントをフィルター処理し、結果のドキュメントを_tsタイムスタンプ システム プロパティで並べ替え、次に Tags 配列をプロジェクトおよびフラット化します。

次のステップ

Azure Cosmos DB のストアド プロシージャ、トリガー、およびユーザー定義関数の概念と使用方法について説明します。