it-roy-ru.com

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

Похоже, что 'select count (*) from c' в запросах SQL, разрешенных documentdb на сайте Azure и через проводник 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); 
26
ProgramTheWorld

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

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

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

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

SELECT VALUE COUNT(1) FROM c

[ 1234 ]

75
micah

На самом деле работает в этой точке:

ВЫБЕРИТЕ СЧЕТ (c.id) ОТ c

21
Mike Katchourine

Вкратце - вот пример Подсчет хранимой процедуры через JS с поддержкой продолжения. 

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

Upd Mar 2017: В последнем SDB SDB см. пресс-релиз DDB Aggregates есть полная поддержка базовых агрегатов, но без GROUP BY (пока). Вот GIT REpo с примерами: https://github.com/arramac/Azure-documentdb-dotnet/tree/master/samples/code-samples/Queries

9
zmische

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

SELECT VALUE COUNT(1) FROM myCollection

 enter image description here

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

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

5
Sajeetharan

Я провел тест на многораздельную коллекцию БД документов с 200К сущностями в одном разделе. Коллекция настроена с 10K RU/сек.

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

  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);
    }
}
1
Dogu Arslan

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

0
Luis Delgado

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

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/

0
ProgramTheWorld