CosmosDbクエリで個別の要素をカウントする直接関数はありますか?
これはデフォルトのカウントです:
_SELECT value count(c.id) FROM c
_
そして、カウントなしの明確な作品:
_SELECT distinct c.id FROM c
_
しかし、これは悪い要求を返します-構文エラー: SELECT value count(distinct c.id) FROM c
count
とdistinct
はどのように連携しますか?
私が知っているように、今のところ、CosmosDBはネストされたクエリをサポートしていません。
Uが望むことを行う唯一の方法は、クエリ結果としてすべての個別のIDを返し、それらを信頼することです。コードで直接行うことも、ストアドプロシージャを使用して行うこともできます(多数のドキュメントでより効率的になるはずです)。
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制限を超えて、失敗する可能性があることです。その場合は、サーバー側で同様のコードを実装できますが、それほど優れていません。