Подтвердить что ты не робот

Получить счетчик записей в Azure DocumentDb

Кажется, что "select count (*) from c" в запросах SQL, разрешенных documentdb на лазурном сайте и через explorer documentdb (https://studiodocumentdb.codeplex.com/) не поддерживается. На сегодняшний день единственный способ получить счетчик записей, который я нашел, - это код (см. Ниже). Тем не менее, в нашей коллекции сейчас достаточно файлов, и это сбой. Есть ли способ подсчитать, сколько документов в коллекции работает больше, чем мое решение?

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

Ответ 1

До реализации ключевого слова "count" вы должны выполнить свой запрос в процедуре хранилища на сервере. Будьте осторожны, чтобы не получить все столбцы/свойства в вашем запросе, если вы хотите только подсчет.

Выберите только идентификатор:

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

Ответ 2

Теперь это возможно в 2017 году нашего лорда.

SELECT VALUE COUNT(1) FROM c

[ 1234 ]

Ответ 3

Фактически работает на этом этапе:

SELECT COUNT (c.id) FROM c

Ответ 4

Только для примера - вот пример Считать сохраненную процедуру через JS с поддержкой продолжения.

И вот еще один инструмент для DocumentDb, который довольно опрятен: https://github.com/mingaliu/DocumentDBStudio/releases

Обновление Мар 2017: В последнем SDK DDB см. Пресс-релиз DDB Aggregates, полная поддержка основных агрегатов отсутствует, без GROUP BY, хотя (на данный момент). Вот GIT REpo с примерами: https://github.com/arramac/azure-documentdb-dotnet/tree/master/samples/code-samples/Queries

Ответ 5

Это возможно так же, как вы пишете SQL-запрос сейчас,

SELECT VALUE COUNT(1) FROM myCollection

enter image description here

ПРИМЕЧАНИЕ: COUNT (1) не будет работать для огромных наборов данных.

Вы можете прочитать больше о поддерживаемых запросах здесь

Ответ 6

В настоящее время не существует. У меня был подобный сценарий, и мы закончили тем, что добавили счетчик атрибута документа, который обновляется каждый раз, когда документ добавляется или удаляется. Вы даже можете сделать эти два шага как часть процедуры хранения или триггера, если хотите атомарность.

Ответ 7

Мое решение для подсчета количества кодов также работает... как только я только что выбрал идентификатор, как указал папа Оур:) Чтобы получить исходное сообщение для работы, замените эту строку:

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/

Ответ 8

Я выполнил тест для разбитой коллекции БД Document с 200К сущностями в одном разделе.

Запросы на стороне клиента:

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