web-dev-qa-db-ja.com

Azure DocumentDbでレコードカウントを取得する

Azureサイトのdocumentdbおよびdocumentdb Explorerで許可されているSQLクエリの「select count(*)from c」のようです( https://studiodocumentdb.codeplex.com/ )はサポートされていません。これまでのところ、私が見つけたレコード数を取得する唯一の方法はコードからです(以下を参照)。ただし、コレクションに十分なファイルが存在するため、クラッシュします。私のソリューションよりも機能するコレクション内のドキュメントの数を数える方法はありますか?

DocumentClient dc = GetDocumentDbClient();
var databaseCount = dc.CreateDatabaseQuery().ToList();
Database azureDb = dc.CreateDatabaseQuery().Where(d => d.Id == Constants.WEATHER_UPDATES_DB_NAME).ToArray().FirstOrDefault();

var collectionCount = dc.CreateDocumentCollectionQuery(azureDb.SelfLink).ToList();

DocumentCollection update = dc.CreateDocumentCollectionQuery(azureDb.SelfLink).Where(c => c.Id == "WeatherUpdates").ToArray().FirstOrDefault();

var documentCount = dc.CreateDocumentQuery(update.SelfLink, "SELECT * FROM c").ToList();

MessageBox.Show("Databases: " + databaseCount.Count().ToString() + Environment.NewLine
                +"Collections: " + collectionCount.Count().ToString() + Environment.NewLine
                + "Documents: " + documentCount.Count().ToString() + Environment.NewLine, 
                 "Totals", MessageBoxButtons.OKCancel); 
36
ProgramTheWorld

「count」キーワードを実装するまで、サーバー上のストアプロシージャでクエリを実行する必要があります。カウントのみが必要な場合は、クエリのすべての列/プロパティを取得しないように注意してください。

次のようなIDのみを選択します。

  dc.CreateDocumentQuery(update.SelfLink, "SELECT c.id FROM c")
10
Papa Ours

これは、主君の2017年に可能になりました。

SELECT VALUE COUNT(1) FROM c

[ 1234 ]

95
micah

この時点で実際に動作します:

SELECT COUNT(c.id)FROM c

22

要約すると、継続サポートを使用した JSによるストアドプロシージャのカウント の例です。

そして、これはDocumentDb用のもう1つのツールです。 https://github.com/mingaliu/DocumentDBStudio/releases

2017年3月更新:最新のDDB SDKでは、 DDB Aggregatesプレスリリース を参照してくださいしかし(今のところ)。 GIT REpoと例を示します: https://github.com/arramac/Azure-documentdb-dotnet/tree/master/samples/code-samples/Queries

9
zmische

これは、今すぐSQLクエリを記述するのと同じ方法で可能です。

SELECT VALUE COUNT(1) FROM myCollection

enter image description here

注:COUNT(1)は、巨大なデータセットでは機能しません。

サポートされているクエリの詳細については、ここをご覧ください。

7

単一のパーティションに200Kのエンティティがあるパーティション化されたDocument dbコレクションに対してテストを行いました。コレクションは10K RU /秒で構成されます。

クライアント側のクエリ:

  1. "SELECT VALUE COUNT(1) FROM c"

経過時間(ミリ秒):2471ミリ秒消費された要求単位の合計:6143.35

注:これは最速で最も安価なオプションです。ただし、クライアント側で継続を処理し、返された継続トークンを使用して次のクエリを実行する必要があることに注意してください。

  1. "SELECT COUNT(c.id) FROM c"

経過時間(ミリ秒):2589合計RU:6682.43

注:これは非常に近いですが、少し遅く、より高価です。

サーバー側/ストアドプロシージャ:

  1. ストアドプロシージャが必要な場合は、ここに1つあります。 https://github.com/Azure/azure-cosmosdb-js-server/blob/master/samples/stored-procedures/Count.js =

ただし、問題があることに注意してください。カウントを計算するためだけに、コレクション/パーティション内のすべてのドキュメントを内部的に読み取ります。その結果、はるかに遅くなり、はるかに高価になります!

経過時間(ミリ秒):8584ミリ秒合計RU:13419.31

  1. 上記のリンクで提供されているストアドプロシージャを更新して、パフォーマンスを改善しました。以下のCount.jsを完全に更新しました。更新されたストアドプロシージャは、オリジナルよりも高速で安価に実行され、最高のパフォーマンスのクライアント側クエリ(上記の#1)と同等です。

経過時間(ミリ秒):2534ミリ秒合計RU:6298.36

function count(filterQuery, continuationToken) {
    var collection = getContext().getCollection();
    var maxResult = 500000; 
    var result = 0;

    var q = 'SELECT \'\' FROM root';
    if (!filterQuery) {
        filterQuery = q;
    }

    tryQuery(continuationToken);

    function tryQuery(nextContinuationToken) {
        var responseOptions = { continuation: nextContinuationToken, pageSize: maxResult };

        if (result >= maxResult || !query(responseOptions)) {
            setBody(nextContinuationToken);
        }
    }

    function query(responseOptions) {
        return (filterQuery && filterQuery.length) ?
            collection.queryDocuments(collection.getSelfLink(), filterQuery, responseOptions, onReadDocuments) :
            collection.readDocuments(collection.getSelfLink(), responseOptions, onReadDocuments);
    }

    function onReadDocuments(err, docFeed, responseOptions) {
        if (err) {
            throw 'Error while reading document: ' + err;
        }

        result += docFeed.length;

        if (responseOptions.continuation) {
            tryQuery(responseOptions.continuation);
        } else {
            setBody(null);
        }
    }

    function setBody(continuationToken) {
        var body = { count: result, continuationToken: continuationToken };
        getContext().getResponse().setBody(body);
    }
}
2
Dogu Arslan

現在は存在しません。同様のシナリオがあり、ドキュメントが追加または削除されるたびに更新されるカウンターをドキュメント属性に追加することになりました。アトミック性が必要な場合は、ストアプロシージャまたはトリガーの一部としてこれらの2つのステップを作成することもできます。

0
Luis Delgado

私のコードカウントソリューションも機能しています...パパアワーズが指摘したようにIDを選択したら:)元の投稿を機能させるには、次の行を置き換えます:

var documentCount = dc.CreateDocumentQuery(update.SelfLink, "SELECT * FROM c").ToList();

この行で:

var documentCount = dc.CreateDocumentQuery(update.SelfLink, "SELECT id FROM c").ToList()

Documentdb studioで動作するストアドプロシージャのアイデアが気に入っています(本当にクールなプロジェクト:))- https://studiodocumentdb.codeplex.com/

0
ProgramTheWorld