API для выполнения запросов JavaScript в Azure Cosmos DB

ПРИМЕНИМО К: API SQL

Помимо выдачи запросов с помощью API SQL в Azure Cosmos DB, серверный пакет SDK Cosmos DB предоставляет интерфейс JavaScript для выполнения оптимизированных запросов в хранимых процедурах и триггерах Cosmos DB. Не обязательно знать язык SQL для использования этого интерфейса JavaScript. API запросов в JavaScript позволяет программно создавать запросы, передавая предикатные функции в образующие последовательность вызовы функций. Для этого используется синтаксис, который понимают встроенные элементы массива ECMAScript5 и популярные библиотеки JavaScript, например Lodash. Чтобы запросы были эффективно выполнены с помощью индексов Azure Cosmos DB, их анализирует среда выполнения JavaScript.

Поддерживаемые функции JavaScript

Компонент Описание
chain() ... .value([callback] [, options]) Начинает вызов по цепочке, который должен завершаться value().
filter(predicateFunction [, options] [, callback]) Фильтрует входные данные с помощью функции предиката, которая возвращает значение true или false для фильтрации входных документов в наборе результатов. Эта функция действует так же, как предложение WHERE в SQL.
flatten([isShallow] [, options] [, callback]) Собирает и объединяет массивы для каждого входного элемента в один массив. Эта функция действует так же, как предложение SelectMany в LINQ.
map(transformationFunction [, options] [, callback]) Применяет проекцию, заданную функцией преобразования, которая сопоставляет каждый входной элемент с объектом или значением JavaScript. Эта функция действует так же, как предложение SELECT в SQL.
pluck([propertyName] [, options] [, callback]) Эта функция заменяет собой сопоставление, которое извлекает значение определенного свойства из каждого входного элемента.
sortBy([predicate] [, options] [, callback]) Используя заданный предикат, создает новый набор документов путем сортировки документов во входном потоке документов по возрастанию. Эта функция действует так же, как предложение ORDER BY в SQL.
sortByDescending([predicate] [, options] [, callback]) Используя заданный предикат, создает новый набор документов путем сортировки документов во входном потоке документов по убыванию. Эта функция действует так же, как предложение ORDER BY x DESC в SQL.
unwind(collectionSelector, [resultSelector], [options], [callback]) Выполняет самосоединение со внутренним массивом и добавляет в итоговую проекцию результаты с обеих сторон в виде кортежей. Например, в результате присоединения документа person к person.pets создадутся кортежи [person, pet]. Эта функция похожа на SelectMany в .NET LINK.

Если конструкции JavaScript включены в предикатную функцию и/или селектор, они автоматически оптимизированы для непосредственного выполнения в индексах Azure Cosmos DB:

  • Простые операторы: = + - * / % | ^ & == != === !=== < > <= >= || && << >> >>>! ~
  • литералы, включая литерал объекта: {};
  • var, return.

Следующие конструкции JavaScript не оптимизированы для использования в индексах Azure Cosmos DB:

  • Поток управления (например if, for или while)
  • Вызовы функций

Более подробные сведения см. в документации по серверному пакету JavaScript для Cosmos DB.

Таблица соответствия запросов SQL и JavaScript

В следующей таблице представлены разные запросы SQL и соответствующие им запросы JavaScript. Как и запросы SQL, свойства (например, item.id) чувствительны к регистру.

Примечание

__ (двойное подчеркивание) является псевдонимом для getContext().getCollection() при использовании API запросов JavaScript.

SQL API запросов JavaScript Описание
SELECT *
FROM docs
__.map(function(doc) {
    return doc;
});
Возвращает все документы (с разбивкой на страницы с отметками "продолжить").
SELECT
   docs.id,
   docs.message AS msg,
   docs.actions
FROM docs
__.map(function(doc) {
    return {
        id: doc.id,
        msg: doc.message,
        actions:doc.actions
    };
});
Создает проекцию идентификатора, сообщения (msg) и действия для всех документов.
SELECT *
FROM docs
WHERE
   docs.id="X998_Y998"
__.filter(function(doc) {
    return doc.id ==="X998_Y998";
});
Запрашивает документы с предикатом: id = "X998_Y998".
SELECT *
FROM docs
WHERE
   ARRAY_CONTAINS(docs.Tags, 123)
__.filter(function(x) {
    return x.Tags && x.Tags.indexOf(123) > -1;
});
Запрашивает все документы, имеющие свойство Tags. Tags является массивом, содержащим значение 123.
SELECT
   docs.id,
   docs.message AS msg
FROM docs
WHERE
   docs.id="X998_Y998"
__.chain()
    .filter(function(doc) {
        return doc.id ==="X998_Y998";
    })
    .map(function(doc) {
       return {
            id: doc.id,
            msg: doc.message
       };
    })
.value();
Запрашивает документы с предикатом id = "X998_Y998" и затем выполняет проекцию идентификатора и сообщения (msg).
SELECT VALUE tag
FROM docs
JOIN tag IN docs.Tags
ORDER BY docs._ts
__.chain()
    .filter(function(doc) {
        return doc.Tags && Array.isArray(doc.Tags);
    })
    .sortBy(function(doc) {
        return doc._ts;
    })
    .pluck("Tags")
    .flatten()
    .value()
Выполняет фильтрацию для получения документов, у которых есть свойство массива Tags, и сортирует отобранные документы по системному свойству метки отметки _ts, после чего выполняет проекцию и объединение массива Tags.

Дальнейшие действия

Дополнительные сведения о том, как записать и использовать хранимые процедуры, триггеры и определяемые пользователем функции в Azure Cosmos DB, см. в статьях ниже: