获取Azure DocumentDb中的记录计数

hk8txs48  于 2023-01-27  发布在  其他
关注(0)|答案(9)|浏览(116)

好像是“选择计数(*)从Azure站点中的documentdb允许的SQL查询中的c',并通过documentdb资源管理器(https://studiodocumentdb.codeplex.com/)。到目前为止,我找到的获取记录计数的唯一方法是从代码(见下文)。然而,在我们的集合中有足够的文件,现在这是崩溃的。2有没有办法得到一个集合中有多少文档比我的解决方案更有效的计数?

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

xwbd5t1u1#

这在我们主的2017年是可能的。
SELECT VALUE COUNT(1) FROM c
[ 1234 ]

nxagd54h

nxagd54h2#

实际上在这一点上是有效的:

SELECT COUNT(c.id) FROM c
twh00eeo

twh00eeo3#

这与您现在编写SQL查询的方式相同,

SELECT VALUE COUNT(1) FROM myCollection

**注意:**COUNT(1)不适用于大型数据集。

您可以从**here**阅读有关支持的查询的详细信息

yqyhoc1h

yqyhoc1h4#

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

dc.CreateDocumentQuery(update.SelfLink, "SELECT c.id FROM c")
qco9c6ql

qco9c6ql5#

简单回顾一下-这里是具有延续支持的Count Stored Procedure via JS示例。
下面是DocumentDb的另一个非常简洁的工具:https://github.com/mingaliu/DocumentDBStudio/releases

2017年3月更新:在最新的DDB SDK中,参见DDB Aggregates press release,它完全支持基本聚合,但没有GROUP BY(目前)。https://github.com/arramac/azure-documentdb-dotnet/tree/master/samples/code-samples/Queries

avwztpqn

avwztpqn6#

我对一个分区文档数据库集合进行了测试,该集合在一个分区中有200 K个实体,配置为10 KRU/秒。
客户端查询:

  1. "SELECT VALUE COUNT(1) FROM c"
    经过时间(毫秒):2471毫秒消耗的总请求单位:6143.35
    注:这是速度最快、成本最低的选项。但请记住,您需要在客户端处理continuation,并使用返回的continuation标记执行下一个查询,否则可能会得到部分结果/计数。
  2. "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);
    }
}
u3r8eeie

u3r8eeie7#

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

xxls0lw8

xxls0lw88#

我的代码计数解决方案也是工作...一旦我只是选择了id作为一个爸爸我们指出:)让我原来的职位工作,取代此行:

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/

tcbh2hod

tcbh2hod9#

要查找Id = IdValue的记录计数:

SELECT COUNT(1) FROM c where c.Id = <IdValue>

相关问题