Поделиться через


Запрос ресурсов Azure Cosmos DB с помощью REST API

Azure Cosmos DB — это глобально распределенная многомодельная база данных с поддержкой разных API. В этой статье описывается использование REST для запроса ресурсов с помощью API SQL.

Как выполнить запрос ресурса с помощью REST?

Чтобы выполнить запрос SQL на ресурс, выполните следующие действия.

  • POST Выполните метод для пути к ресурсу, используя JSON с свойством query , для свойства задана строка SQL-запроса, а для свойства "parameters" задан массив значений необязательных параметров.
  • В качестве заголовка x-ms-documentdb-isquery установите True.
  • В качестве заголовка Content-Type установите application/query+json.

Пример выполнения SQL-запроса к ресурсу с помощью .NET см. в разделе Пример REST из .NET.

Пример

Ниже приведен пример операции запроса REST с ресурсами документа. В этом примере нужно найти все документы, автором которых является "Don".

POST https://contosomarketing.documents.azure.com/dbs/XP0mAA==/colls/XP0mAJ3H-AA=/docs HTTP/1.1  
x-ms-documentdb-isquery: True  
x-ms-date: Mon, 18 Apr 2015 13:05:49 GMT  
authorization: type%3dmaster%26ver%3d1.0%26sig%3dkOU%2bBn2vkvIlHypfE8AA5fulpn8zKjLwdrxBqyg0YGQ%3d  
x-ms-version: 2015-12-16  
x-ms-query-enable-crosspartition: True  
Accept: application/json  
Content-Type: application/query+json  
Host: contosomarketing.documents.azure.com  
Content-Length: 50  

{  
    "query": "SELECT * FROM root WHERE (root.Author.id = 'Don')",  
    "parameters": []  
}  
  

Сведения о запросе

Метод Универсальный код ресурса (URI) запроса
POST Обязательно. Тип аутентификации и маркер подписи. Для этой операции разрешено использовать только маркер главного ключа. Дополнительные сведения см. в разделе контроль доступа ресурсов Cosmos DB.

Заголовки запросов

В следующей таблице приведены общие заголовки, используемые для выполнения операций запроса.

Стандартный заголовок Описание
Авторизация Обязательно. Тип аутентификации и маркер подписи. Для этой операции разрешено использовать только маркер главного ключа. Дополнительные сведения см. в разделе контроль доступа ресурсов Cosmos DB.
Content-Type Обязательно. В качестве значения должно быть задано приложение или запрос +json.
Принятие Необязательно. На данный момент Cosmos DB всегда возвращает полезные данные ответа в стандартном формате JSON. Клиент должен иметь возможность принять текст ответа в стандартном формате JSON.
User-Agent Необязательно. Агент пользователя, выполняющий запрос. Рекомендуемый формат: {имя агента пользователя}/{версия}. Например, пакет SDK API SQL для .NET задает строку User-Agent Microsoft.Document.Client/1.0.0.0.
Настраиваемый заголовок Описание
x-ms-date Обязательно. Дата запроса, как указано в RFC 1123. Формат даты выражается, например, в формате UTC. Пятница, 8 апреля 2015 г., 03:52:31 (GMT).
x-ms-documentdb-isquery Обязательно. Это свойство должно иметь значение true.
x-ms-max-item-count Необязательно. Для постраничного просмотра результирующего набора задайте в качестве этого заголовка максимальное количество элементов, возвращаемое на одной странице.
x-ms-continuation Необязательно. Чтобы перейти на следующую страницу элементов, задайте в качестве значения этого заголовка маркер продолжения для следующей страницы.
x-ms-version Необязательно. Версия службы REST Cosmos DB. Если заголовок не указан, используется последняя версия. Дополнительные сведения см. в справочнике по REST API Azure Cosmos DB.
x-ms-documentdb-query-enable-scan Необязательно. Использовать сканирование индекса при выполнения запроса, если путь к нужному индексу типа недоступен.
x-ms-session-token Необязательно. Токен сеанса для запроса. Используется для обеспечения согласованности сеанса.
x-ms-partition-key Необязательно. Если этот параметр указан, запрос выполняется только для документов, соответствующих значению ключа секции в заголовке .
x-ms-documentdb-query-enablecrosspartition Необязательно. Для всех запросов, которые не фильтруется по одному ключу секции, необходимо задать значение true. Запросы, которые фильтруются по значению ключа одной секции, будут выполняться только для одной секции, даже если задано значение true.
x-ms-documentdb-populatequerymetrics Необязательно. Для возврата метрик запроса необходимо задать значение True .

Текст запроса

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

Вы также получите 400 неверный запрос, если запрос не может быть обработан шлюзом.

Свойство Описание
query Обязательно. Строка запроса SQL для запроса. Дополнительные сведения см. в справочнике по синтаксису SQL в Azure Cosmos DB.
параметры Обязательно. Массив JSON параметров, заданных в виде пар "имя-значение". Массив параметров может содержать от нуля до нескольких параметров. Каждый параметр должен иметь следующие значения: name: имя параметра. Имена параметров должны быть допустимыми строковыми литералами и начинаться с "@".value: значение параметра. Может быть любым допустимым значением JSON (строка, число, объект, массив, логическое значение или null).

Пример запроса

В следующем примере выполняется параметризованный SQL-запрос со строковым параметром для @author.

POST https://contosomarketing.documents.azure.com/dbs/XP0mAA==/colls/XP0mAJ3H-AA=/docs HTTP/1.1  
x-ms-documentdb-isquery: True  
x-ms-date: Mon, 18 Apr 2015 13:05:49 GMT  
authorization: type%3dmaster%26ver%3d1.0%26sig%3dkOU%2bBn2vkvIlHypfE8AA5fulpn8zKjLwdrxBqyg0YGQ%3d  
x-ms-version: 2015-04-08  
Accept: application/json  
Content-Type: application/query+json  
Host: contosomarketing.documents.azure.com  
Content-Length: 50  
  
{  
    "query": "SELECT * FROM root WHERE (root.Author.id = @author)",  
    "parameters":   
    [  
        { "name": "@author", "value": "Leo Tolstoy"}  
    ]  
}  

Дополнительные сведения о запросах SQL см. в статье SQL-запросы для Azure Cosmos DB.

Сведения об ответах

Ниже приведены типичные коды состояния, возвращаемые этой операцией. Сведения о кодах состояния ошибок см. в статье Коды состояния HTTP для Azure Cosmos DB.

Код Описание
200 Ok Операция прошла успешно.
400 Bad Request (Неверный запрос) Неправильный синтаксис инструкции SQL.
401 Unauthorized (Не авторизовано) Не задан ни заголовок Авторизация, ни заголовок x-ms-date. Ошибка 401 также возвращается, если для заголовка Authorization задан недопустимый маркер авторизации.
403 — запрещено Истек срок действия маркера авторизации.
404 Not Found (Не найдено) Коллекция больше не является ресурсом. Например, ресурс может быть удален.

Заголовки откликов

Эта операция возвращает следующие общие заголовки. Кроме того, могут быть возвращены дополнительные стандартные и общие заголовки.

Стандартный заголовок Описание
Content-Type Content-Type является приложением или JSON. Cosmos DB всегда возвращает текст ответа в стандартном формате JSON.
Дата Дата и время операции ответа. Этот формат даты времени соответствует формату даты и времени [RFC1123] в UTC.
Настраиваемый заголовок Описание
x-ms-item-count Количество элементов, возвращаемых операцией.
x-ms-continuation Это непрозрачная строка, возвращаемая, если запрос потенциально содержит больше элементов для извлечения.

Заголовок x-ms-continuation можно включить в последующие запросы в качестве заголовка запроса, чтобы возобновить выполнение запроса.
x-ms-request-charge Это количество единиц запроса (ЕЗ), используемых операцией. Дополнительные сведения о единицах запросов см. в статье Единицы запросов в Azure Cosmos DB.
x-ms-activity-id Это уникальный идентификатор операции. Его можно использовать для трассировки выполнения запросов Cosmos DB.
x-ms-session-token Токен сеанса, используемый для последующих запросов. Используется для обеспечения согласованности сеанса.

Текст ответа

Текст ответа для операции запроса состоит из _rid родительского ресурса запрашиваемого ресурса и массива ресурсов, содержащего свойства ресурса для выбора и проекции. Согласно примеру, если запрос выполняется по пути к коллекции docs со свойством _rid, имеющим значение XP0mAJ3H-AA=, ответ будет выглядеть следующим образом:

{"_rid":" XP0mAJ3H-AA=","Documents":   [  ….  ….   ],"_count":10}  
Свойство Описание
_rid Идентификатор ресурса для коллекции, используемой в запросе.
_Рассчитывать Количество возвращенных элементов.
Массив ресурсов Массив, содержащий результаты запроса.

Построение текста запроса

Запрос должен представлять собой допустимый документ JSON, включающий в себя свойство query, которое содержит допустимый SQL-запрос, и свойство parameters, содержащее массив необязательных параметров. Каждый параметр должен иметь свойства name и value для параметров, указанных в запросе. Имена параметров должны начинаться с символа "@". Значения могут быть любыми допустимыми значениями JSON: строками, целыми числами, логическими значениями и значениями null.

Допустимо указывать только подмножество параметров, указанных в тексте запроса . Выражения, ссылающиеся на эти не заданные параметры, приведут к получению результата undefined. Можно также указать дополнительные параметры, которые не используются в тексте query.

Ниже приведены некоторые примеры допустимых запросов. Например, следующий запрос имеет один параметр @id.

{  
    "query": "select * from docs d where d.id = @id",   
    "parameters": [   
        {"@id": "newdoc"}   
     ]  
}  
  

В следующем примере имеется два параметра, один со строковым значением, а другой — с целочисленным значением.

{  
    "query": "select * from docs d where d.id = @id and d.prop = @prop",   
    "parameters": [   
        {"@id": "newdoc"},  
        {"@prop": 5}   
     ]  
}  

В следующем примере доступ к параметрам в предложении SELECT, а также к свойствам осуществляется через имя параметра в качестве параметра.

{  
    "query": "select @id, d[@propName] from docs d",   
    "parameters": [   
        {"@id": "newdoc"},  
        {"@propName": "prop"}  
     ]  
}  

Запросы, которые не могут быть обработаны шлюзом

Любой запрос, требующий состояния в продолжениях, не может обслуживаться шлюзом. В том числе:

  • В начало
  • ORDER BY
  • OFFSET LIMIT
  • Статистические выражения
  • DISTINCT
  • GROUP BY

Ниже приведены запросы, которые могут обслуживаться шлюзом.

  • Простые проекции
  • Фильтры

При возврате ответа для запроса, который не может быть обработан шлюзом, он будет содержать код состояния 400 (BadRequest) и следующее сообщение:

{"code":"BadRequest","message":"The provided cross partition query can not be directly served by the gateway. 
This is a first chance (internal) exception that all newer clients will know how to handle gracefully. 
This exception is traced, but unless you see it bubble up as an exception (which only happens on older SDK clients), 
then you can safely ignore this message.\r\nActivityId: db660ee4-350a-40e9-bc2c-99f92f2b445d, Microsoft.Azure.Documents.Common/2.2.0.0",
"additionalErrorInfo":"{\"partitionedQueryExecutionInfoVersion\":2,\"queryInfo\":{\"distinctType\":\"None\",\"top\":null,\"offset\":null,\"limit\":null,
\"orderBy\":[\"Ascending\"],\"orderByExpressions\":[\"c._ts\"],\"aggregates\":[],
\"rewrittenQuery\":\"SELECT c._rid, [{\\\"item\\\": c._ts}] AS orderByItems, 
c AS payload\\nFROM c\\nWHERE ({documentdb-formattableorderbyquery-filter})\\nORDER BY c._ts\"},
\"queryRanges\":[{\"min\":\"\",\"max\":\"FF\",\"isMinInclusive\":true,\"isMaxInclusive\":false}]}"}

Разбиение на страницы результатов запроса

Запросы поддерживают разбиение на страницы с помощью заголовков x-ms-max-item-count и x-ms-continuation request. Заголовок x-ms-max-item-count указывает максимальное количество значений, которые могут быть возвращены при выполнении запроса. Оно может иметь значение от 1 до 1000, по умолчанию — 100.

Запросы будут возвращать от нуля до указанного в x-ms-max-item-count максимального количества значений из результатов выполнения. Результат запроса содержит заголовок x-ms-item-count, который задает фактическое количество документов, возвращенных запросом. Если имеются дополнительные результаты, которые могут быть получены из запроса, то в ответ включается непустое значение для заголовка x-ms-continuation.

Клиенты могут извлекать последующие страницы с результатами, возвращая заголовок x-ms-continuation в качестве следующего запроса. Для считывания всех результатов клиентам необходимо повторять этот процесс до возвращения пустого заголовка x-ms-continuation.

Выполнение запросов Cosmos DB выполняется без отслеживания состояния на стороне сервера и может быть возобновлено в любое время с помощью заголовка x-ms-continuation . Значение x-ms-continuation использует идентификатор ресурса последнего обработанного документа (_rid) для отслеживания процесса выполнения. Поэтому при удалении и повторной вставке документов между получением страниц документы могут быть исключены из любого пакета запроса. Тем не менее поведение и формат заголовка x-ms-continuation могут измениться в будущих версиях.

См. также: