在 Azure DocumentDb 中获取记录数
Get record count in Azure DocumentDb
似乎不支持 Azure 站点中的 documentdb 允许的 SQL 查询以及通过 documentdb 资源管理器 (https://studiodocumentdb.codeplex.com/) 的 'select count(*) from c'。迄今为止,我发现获得记录计数的唯一方法是通过代码(见下文)。但是,由于崩溃,我们的 collection 中有足够的文件。有没有办法计算 collection 中有多少文档比我的解决方案更有效?
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);
目前不存在。我有一个类似的场景,我们最终向文档属性添加了一个计数器,每次添加或删除文档时该计数器都会更新。如果您想要原子性,您甚至可以将这两个步骤作为存储过程或触发器的一部分。
在执行 "count" 关键字之前,您应该在服务器上的存储过程中进行查询。如果您只想要一个计数,请注意不要在查询中获取所有 columns/properties。
Select只有id喜欢;
dc.CreateDocumentQuery(update.SelfLink, "SELECT c.id FROM c")
我的代码计数解决方案也有效...一旦我选择了我们爸爸指出的 id :) 要让我原来的 post 工作,请替换此行:
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/
只是回顾一下 - 这里是 Count Stored Procedure via JS 的示例,具有持续支持。
这里还有一个非常简洁的 DocumentDb 工具:https://github.com/mingaliu/DocumentDBStudio/releases
2017 年 3 月更新:
在最新的 DDB SDK 中,请参阅 DDB Aggregates press release 完全支持基本聚合,但没有 GROUP BY(目前)。
这是带有示例的 GIT REpo:https://github.com/arramac/azure-documentdb-dotnet/tree/master/samples/code-samples/Queries
此时实际有效:
SELECT COUNT(c.id) FROM c
这在我们主的 2017 年是可能的。
SELECT VALUE COUNT(1) FROM c
[ 1234 ]
这与您现在编写 SQL 查询的方式相同,
SELECT VALUE COUNT(1) FROM myCollection
注意: COUNT(1) 不适用于庞大的数据集。
您可以从 here
阅读更多关于支持查询的信息
我针对单个分区中包含 20 万个实体的分区文档数据库集合进行了测试。 Collection配置10K RU/second.
客户端查询:
"SELECT VALUE COUNT(1) FROM c"
经过的时间(毫秒):2471 毫秒
消耗的总请求单位:6143.35
注意:这是最快和最便宜的选择。但请记住,您需要在客户端处理延续并使用返回的延续令牌执行下一个查询,否则您可能会得到部分 result/count.
"SELECT COUNT(c.id) FROM c"
经过的时间(毫秒):2589
俄罗斯总数:6682.43
注意:这非常接近,但速度稍慢且价格更高。
服务器端/存储过程:
- 如果您需要存储过程,这里提供了一个:
https://github.com/Azure/azure-cosmosdb-js-server/blob/master/samples/stored-procedures/Count.js
但要注意这是有问题的。它在内部读取集合/分区中的所有文档只是为了计算计数。因此,它的速度要慢得多,而且要贵得多!
经过的时间(毫秒):8584 毫秒
总 RU: 13419.31
- 我更新了上面提供的存储过程 link 以提高性能。完整更新 Count.js 下面。更新后的存储过程比原来的执行速度更快、成本更低,并且与性能最佳的客户端查询(上面的#1)相当:
经过的时间(毫秒):2534 毫秒
俄罗斯总数: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);
}
}
似乎不支持 Azure 站点中的 documentdb 允许的 SQL 查询以及通过 documentdb 资源管理器 (https://studiodocumentdb.codeplex.com/) 的 'select count(*) from c'。迄今为止,我发现获得记录计数的唯一方法是通过代码(见下文)。但是,由于崩溃,我们的 collection 中有足够的文件。有没有办法计算 collection 中有多少文档比我的解决方案更有效?
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);
目前不存在。我有一个类似的场景,我们最终向文档属性添加了一个计数器,每次添加或删除文档时该计数器都会更新。如果您想要原子性,您甚至可以将这两个步骤作为存储过程或触发器的一部分。
在执行 "count" 关键字之前,您应该在服务器上的存储过程中进行查询。如果您只想要一个计数,请注意不要在查询中获取所有 columns/properties。
Select只有id喜欢;
dc.CreateDocumentQuery(update.SelfLink, "SELECT c.id FROM c")
我的代码计数解决方案也有效...一旦我选择了我们爸爸指出的 id :) 要让我原来的 post 工作,请替换此行:
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/
只是回顾一下 - 这里是 Count Stored Procedure via JS 的示例,具有持续支持。
这里还有一个非常简洁的 DocumentDb 工具:https://github.com/mingaliu/DocumentDBStudio/releases
2017 年 3 月更新: 在最新的 DDB SDK 中,请参阅 DDB Aggregates press release 完全支持基本聚合,但没有 GROUP BY(目前)。 这是带有示例的 GIT REpo:https://github.com/arramac/azure-documentdb-dotnet/tree/master/samples/code-samples/Queries
此时实际有效:
SELECT COUNT(c.id) FROM c
这在我们主的 2017 年是可能的。
SELECT VALUE COUNT(1) FROM c
[ 1234 ]
这与您现在编写 SQL 查询的方式相同,
SELECT VALUE COUNT(1) FROM myCollection
注意: COUNT(1) 不适用于庞大的数据集。
您可以从 here
阅读更多关于支持查询的信息我针对单个分区中包含 20 万个实体的分区文档数据库集合进行了测试。 Collection配置10K RU/second.
客户端查询:
"SELECT VALUE COUNT(1) FROM c"
经过的时间(毫秒):2471 毫秒 消耗的总请求单位:6143.35
注意:这是最快和最便宜的选择。但请记住,您需要在客户端处理延续并使用返回的延续令牌执行下一个查询,否则您可能会得到部分 result/count.
"SELECT COUNT(c.id) FROM c"
经过的时间(毫秒):2589 俄罗斯总数:6682.43
注意:这非常接近,但速度稍慢且价格更高。
服务器端/存储过程:
- 如果您需要存储过程,这里提供了一个: https://github.com/Azure/azure-cosmosdb-js-server/blob/master/samples/stored-procedures/Count.js
但要注意这是有问题的。它在内部读取集合/分区中的所有文档只是为了计算计数。因此,它的速度要慢得多,而且要贵得多!
经过的时间(毫秒):8584 毫秒 总 RU: 13419.31
- 我更新了上面提供的存储过程 link 以提高性能。完整更新 Count.js 下面。更新后的存储过程比原来的执行速度更快、成本更低,并且与性能最佳的客户端查询(上面的#1)相当:
经过的时间(毫秒):2534 毫秒 俄罗斯总数: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);
}
}