It seems like \'select count(*) from c\' in the SQL queries allowed by documentdb in the azure site and through the documentdb explorer (https://studiodocumentdb.codeplex.com/)
This is now possible in the year 2017 of our lord.
SELECT VALUE COUNT(1) FROM c
[ 1234 ]
My code count solution is also working...once I just selected the id as a Papa Ours pointed out :) To get my original post to work, replace this line:
var documentCount = dc.CreateDocumentQuery(update.SelfLink, "SELECT * FROM c").ToList();
with this line:
var documentCount = dc.CreateDocumentQuery(update.SelfLink, "SELECT id FROM c").ToList()
I still like the idea of the stored procedure as it will work in the documentdb studio (really cool project :)) - https://studiodocumentdb.codeplex.com/
Currently does not exist. I had a similar scenario and we ended up adding a counter to a document attribute that gets updated every time a document gets added or deleted. You could even make these two steps as part of a store procedure or a trigger if you want atomicity.
Until the implementation of the "count" keyword, you should do your query in a store procedure on the server. Take care to not get all columns/properties in your query if you want only a count.
Select only the id like;
dc.CreateDocumentQuery(update.SelfLink, "SELECT c.id FROM c")
I did a test against a partitioned Document db collection with 200K entities in a single partition. The Collection is configured with 10K RU/second.
Client side queries:
"SELECT VALUE COUNT(1) FROM c"
Time elapsed (ms): 2471 milliseconds Total Request Units consumed: 6143.35
Note: This is the fastest and cheapest option. But keep in mind that you would need to handle continuation on the client side and execute next query using the returned continuation token otherwise you may get partial result/count.
"SELECT COUNT(c.id) FROM c"
Time elapsed (ms): 2589 Total RU: 6682.43
Note: This is very close but slightly slower and more expensive.
Server side / Stored Procedure:
But beware it is problematic.. It internally reads all documents in the collection / partition just to calculate the count. As a result it is much slower and a lot more expensive!
Time elapsed (ms): 8584 milliseconds Total RU: 13419.31
Time elapsed (ms): 2534 milliseconds Total 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);
}
}
Actually works at this point:
SELECT COUNT(c.id) FROM c