CosmosDb рассчитывать различные элементы - PullRequest
0 голосов
/ 30 мая 2018

Существует ли прямая функция для подсчета отдельных элементов в запросе CosmosDb?

Это счетчик по умолчанию:

SELECT value count(c.id) FROM c

И отдельные операции без подсчета:

SELECT distinct c.id FROM c

Но это возвращает неверный запрос - синтаксическая ошибка: SELECT value count(distinct c.id) FROM c

Как count и distinct будут работать вместе?

Ответы [ 5 ]

0 голосов
/ 15 мая 2019

Как насчет SELECT COUNT (1) FROM (SELECT различный c.id ОТ c) AS t ;?- Evaldas Buinauskas 30 мая 18 года в 14: 44

15 мая 2019 года вышеприведенный комментарий работает с условием Where, я не пробовал с Join, но запрос выполняетверните ответ, который я ищу.

И он работает с ограничением в 100 элементов в CosmosDB.

Если я приведу пример с продуктом, он должен быть: SELECT COUNT(1) FROM (SELECT DISTINCT c.Id FROM c WHERE c.Brand = 'Coca')

0 голосов
/ 07 мая 2019

Distinct Ключевое слово официально поддерживается и снова доступно,

Ключевое слово DISTINCT удаляет дубликаты в проекции запроса.

SELECT DISTINCTЗНАЧЕНИЕ f.lastName ОТ Семей f

0 голосов
/ 29 июня 2018

Azure cosmos DB пока не поддерживает отдельное ключевое слово как часть SQL API.Лучший способ добиться этого - использовать хранимую процедуру с пользовательским кодом.Вы можете найти более подробную информацию о пользовательских хранимых процедурах здесь .

Кажется, что ключевое слово явно недостаточно развито.
Пожалуйста, найдите ссылку здесь .

cosmos DB поддерживает большинство агрегатных функций, см. Список поддерживаемых агрегатных функций здесь .

Более подробную информацию см. В следующей ссылке .

0 голосов
/ 04 января 2019

Поддержка отдельного была добавлена ​​ 19 октября 2018

Следующий запрос работает просто отлично

SELECT distinct value c FROM c join p in c.products

Однако, он все еще не работает для подсчета.

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

Если вы передадите отдельный запрос, как указано выше, в хранимой процедуре, приведенной ниже, вы получите отдельный счетчик

function count(queryCommand) {
  var response = getContext().getResponse();
  var collection = getContext().getCollection();
  var count = 0;

  query(queryCommand);

  function query(queryCommand, continuation){
    var requestOptions = { continuation: continuation };
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        queryCommand,
        requestOptions,
        function (err, feed, responseOptions) {
            if (err) {
                throw err;
            }

            //  Scan results
            if (feed) {
                count+=feed.length;
            }

            if (responseOptions.continuation) {
                //  Continue the query
                query(queryCommand, responseOptions.continuation)
            } else {
                //  Return the count in the response
                response.setBody(count);
            }
        });
    if (!isAccepted) throw new Error('The query was not accepted by the server.');
  }
}

ПроблемаЭтот обходной путь заключается в том, что он потенциально может пересечь лимит RU для вашей коллекции и быть неудачным.Если это так, вы можете реализовать подобный код на стороне сервера, что не так уж и хорошо.

0 голосов
/ 31 мая 2018

Как я знаю, на данный момент Cosmos DB не поддерживает вложенные запросы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...