API для выполнения запросов JavaScript в Azure Cosmos DB
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
Помимо выдачи запросов с помощью API для NoSQL в Azure Cosmos DB, пакет SDK на стороне сервера Azure Cosmos DB предоставляет интерфейс JavaScript для выполнения оптимизированных запросов в хранимых процедурах и триггерах Azure Cosmos DB. Не обязательно знать язык SQL для использования этого интерфейса JavaScript. API запросов JavaScript позволяет программно создавать запросы путем передачи функций предиката в последовательность вызовов функций с синтаксисом, аналогичным встроенным массивам ECMAScript5 и популярным библиотекам JavaScript, таким как Lodash. Чтобы запросы были эффективно выполнены с помощью индексов Azure Cosmos DB, их анализирует среда выполнения JavaScript.
Поддерживаемые функции JavaScript
Функция | Description |
---|---|
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 LINQ. |
Если конструкции JavaScript включены в предикатную функцию и/или селектор, они автоматически оптимизированы для непосредственного выполнения в индексах Azure Cosmos DB:
- Простые операторы:
=
+
-
*
/
%
|
^
&
==
!=
===
!==
<
>
<=
>=
||
&&
<<
>>
>>>
~
- литералы, включая литерал объекта:
{}
; - var, return.
Следующие конструкции JavaScript не оптимизированы для использования в индексах Azure Cosmos DB:
- Поток управления:
if
for
while
- вызовы функций.
Дополнительные сведения см. в документации по JavaScript на стороне сервера Azure Cosmos DB.
Таблица соответствия запросов SQL и JavaScript
В следующей таблице представлены разные запросы SQL и соответствующие им запросы JavaScript. Как и в sql-запросах, свойства (например, item.id
) чувствительны к регистру.
Примечание.
__
(двойное подчеркивание) является псевдонимом для getContext().getCollection()
при использовании API запросов JavaScript.
SQL | API запросов JavaScript | Description |
---|---|---|
SELECT * FROM docs |
__.map(function(doc) { return doc; }); |
Возвращает все документы (с разбивкой на страницы с отметками "продолжить"). |
SELECT docs.id, docs.message AS msg, docs.actions FROM docs |
__.map(function(doc) { возвращается { 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) { возвращается { 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, см. в статьях ниже:
- Как записывать хранимые процедуры и триггеры с помощью API запросов JavaScript
- Working with Azure Cosmos DB stored procedures, triggers, and user-defined functions (Работа с хранимыми процедурами, триггерами и определяемыми пользователем функциями в Azure Cosmos DB)
- Как зарегистрировать и использовать хранимые процедуры, триггеры и определяемые пользователем функции в Azure Cosmos DB
- Azure Cosmos DB JavaScript server-side API reference (Справочные материалы по API на стороне сервера для JavaScript Azure Cosmos DB)
- Статья о JavaScript ES6 (ECMA 2015)