44

在 azure 站点中的 documentdb 和通过 documentdb 资源管理器( https://studiodocumentdb.codeplex.com/)允许的 SQL 查询中,似乎不支持“select count(*) from c” 。迄今为止,获得我发现的记录计数的唯一方法是通过代码(见下文)。但是,现在我们的集合中有足够的文件,这正在崩溃。有没有办法计算一个集合中有多少文档比我的解决方案更有效?

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); 
4

8 回答 8

119

这在我们主的 2017 年是可能的。

SELECT VALUE COUNT(1) FROM c

[ 1234 ]

于 2017-04-22T15:26:10.680 回答
28

实际上在这一点上工作:

SELECT COUNT(c.id) FROM c
于 2017-02-23T18:11:18.323 回答
11

在执行“count”关键字之前,您应该在服务器上的存储过程中进行查询。如果您只需要计数,请注意不要在查询中获取所有列/属性。

只选择id喜欢;

  dc.CreateDocumentQuery(update.SelfLink, "SELECT c.id FROM c")
于 2015-01-05T07:05:05.020 回答
11

This is possible in the same way you write SQL query now,

SELECT VALUE COUNT(1) FROM myCollection

enter image description here

NOTE: COUNT(1) won't work for a huge datasets.

You can read more about supported queries from here

于 2018-03-09T19:49:52.273 回答
9

回顾一下 - 这是通过 JS 计数存储过程的示例,具有持续支持。

这里还有一个非常简洁的 DocumentDb 工具:https ://github.com/mingaliu/DocumentDBStudio/releases

2017 年 3 月更新:在最新的 DDB SDK 中,请参阅DDB Aggregates 新闻稿,其中完全支持基本聚合,但没有 GROUP BY(目前)。这是带有示例的 GIT REpo:https ://github.com/arramac/azure-documentdb-dotnet/tree/master/samples/code-samples/Queries

于 2015-06-22T13:02:06.310 回答
6

我对单个分区中包含 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. 如果您需要存储过程,这里提供了一个: 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);
    }
}
于 2018-12-19T09:45:48.067 回答
0

我的代码计数解决方案也在工作......一旦我刚刚选择了 id 作为 Papa Ours 指出的 :) 要让我的原始帖子正常工作,请替换此行:

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

用这条线:

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

我仍然喜欢存储过程的想法,因为它可以在 documentdb 工作室中工作(非常酷的项目:)) - https://studiodocumentdb.codeplex.com/

于 2015-01-06T15:38:05.733 回答
0

目前不存在。我有一个类似的场景,我们最终为文档属性添加了一个计数器,每次添加或删除文档时都会更新该计数器。如果您想要原子性,您甚至可以将这两个步骤作为存储过程或触发器的一部分。

于 2015-01-02T22:58:17.437 回答