Pro*_*rld 38 c# azure azure-cosmosdb
看来在azure站点中的documentdb允许的SQL查询中以及通过documentdb explorer(https://studiodocumentdb.codeplex.com/)不能支持"从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);
Run Code Online (Sandbox Code Playgroud)
mic*_*cah 97
现在,我们的主人可以在2017年实现这一目标.
SELECT VALUE COUNT(1) FROM c
[ 1234 ]
小智 24
实际上在这一点上工作:
SELECT COUNT(c.id)FROM c
小智 10
在执行"count"关键字之前,您应该在服务器上的存储过程中进行查询.如果您只想计算,请注意不要在查询中获取所有列/属性.
只选择id;
dc.CreateDocumentQuery(update.SelfLink, "SELECT c.id FROM c")
Run Code Online (Sandbox Code Playgroud)
回顾一下 - 这里是通过JS继续支持的Count存储过程的示例.
这里还有一个非常简洁的DocumentDb工具:https://github.com/mingaliu/DocumentDBStudio/releases
Upd 2017年3月:在最新的DDB SDK中,请参阅DDB Aggregates新闻稿,完全支持基本聚合,但没有GROUP BY(现在).这是GIT REpo的例子:https://github.com/arramac/azure-documentdb-dotnet/tree/master/samples/code-samples/Queries
这与您现在编写SQL查询的方式相同,
SELECT VALUE COUNT(1) FROM myCollection
Run Code Online (Sandbox Code Playgroud)
注意: COUNT(1)不适用于庞大的数据集.
您可以从此处详细了解支持的查询
我对单个分区中包含 20 万个实体的分区文档数据库集合进行了测试。集合配置为 10K RU/秒。
客户端查询:
"SELECT VALUE COUNT(1) FROM c"
已用时间(毫秒):2471 毫秒消耗的总请求单位:6143.35
注意:这是最快和最便宜的选择。但请记住,您需要在客户端处理延续并使用返回的延续令牌执行下一个查询,否则您可能会得到部分结果/计数。
"SELECT COUNT(c.id) FROM c"
已用时间(毫秒):2589 总 RU:6682.43
注意:这非常接近,但速度稍慢且价格更高。
服务器端/存储过程:
但要注意这是有问题的。它在内部读取集合/分区中的所有文档只是为了计算计数。结果,它慢得多,而且贵得多!
已用时间 (ms):8584 毫秒总 RU:13419.31
已用时间(毫秒):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);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
49723 次 |
最近记录: |