web-dev-qa-db-ja.com

CosmosDbは個別の要素をカウントします

CosmosDbクエリで個別の要素をカウントする直接関数はありますか?

これはデフォルトのカウントです:

_SELECT value count(c.id) FROM c
_

そして、カウントなしの明確な作品:

_SELECT distinct c.id FROM c
_

しかし、これは悪い要求を返します-構文エラー: SELECT value count(distinct c.id) FROM c

countdistinctはどのように連携しますか?

5
Ovi

私が知っているように、今のところ、CosmosDBはネストされたクエリをサポートしていません。

Uが望むことを行う唯一の方法は、クエリ結果としてすべての個別のIDを返し、それらを信頼することです。コードで直接行うことも、ストアドプロシージャを使用して行うこともできます(多数のドキュメントでより効率的になるはずです)。

1
Olha Shumeliuk

Azure cosmos DBは、SQLAPIの一部としてdistinctキーワードをまだサポートしていません。これを実現する最良の方法は、カスタムコードでストアドプロシージャを使用することです。カスタムストアドプロシージャに関する詳細を確認してください ここ

明確なキーワードは未開発のようです。
参照リンクを見つけてください ここ

cosmos DBは、ほとんどの集計関数をサポートしています。サポートされている集計関数のリストを参照してください ここ

詳細については、次の リンク をご覧ください。

0
Ravikumar B

distinctのサポートが 2018年10月19日 に追加されました

次のクエリは問題なく機能します

SELECT distinct value c FROM c join p in c.products

ただし、それでもカウントには機能しません。

個別カウントの回避策は、個別カウントを実行するためのストアドプロシージャを作成することです。基本的にクエリを実行して最後まで続行し、カウントを返します。

上記のような個別のクエリを以下のストアドプロシージャに渡すと、個別のカウントが得られます

function count(queryCommand) {
  var response = getContext().getResponse();
  var collection = getContext().getCollection();
  var count = 0;

  query(queryCommand);

  function query(queryCommand, continuation){
    var requestOptions = { continuation: continuation };
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        queryCommand,
        requestOptions,
        function (err, feed, responseOptions) {
            if (err) {
                throw err;
            }

            //  Scan results
            if (feed) {
                count+=feed.length;
            }

            if (responseOptions.continuation) {
                //  Continue the query
                query(queryCommand, responseOptions.continuation)
            } else {
                //  Return the count in the response
                response.setBody(count);
            }
        });
    if (!isAccepted) throw new Error('The query was not accepted by the server.');
  }
}

この回避策の問題は、コレクションのRU制限を超えて、失敗する可能性があることです。その場合は、サーバー側で同様のコードを実装できますが、それほど優れていません。

0
Aboo