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


Источник данных Cosmos DB для сопоставителя

ОБЛАСТЬ ПРИМЕНЕНИЯ: Разработчик | Базовый | Базовая версия 2 | Стандартный | Standard v2 | Премиум | Премиум версии 2

Политика cosmosdb-data-source сопоставителя разрешает данные для типа объекта и поля в схеме GraphQL с помощью источника данных Cosmos DB . Схема должна быть импортирована в Управление API как API GraphQL.

Используйте политику для настройки одного запроса, запроса на чтение, удаление или запись запроса и необязательный ответ из источника данных Cosmos DB.

Примечание.

Эта политика доступна в предварительной версии. В настоящее время политика не поддерживается на уровне потребления Управление API.

Примечание.

Задайте элементы политики и дочерние элементы в порядке, указанном в правиле политики. Узнайте, как устанавливать или изменять политики службы управления API.

Правило политики

<cosmosdb-data-source> 
    <!-- Required information that specifies connection to Cosmos DB -->
    <connection-info> 
        <connection-string use-managed-identity="true | false"> 
            AccountEndpoint=...;[AccountKey=...;]
        </connection-string> 
        <database-name>Cosmos DB database name</database-name> 
        <container-name>Name of container in Cosmos DB database</container-name>     
    </connection-info>

    <!-- Settings to query using a SQL statement and optional query parameters -->
    <query-request enable-low-precision-order-by="true | false"> 
        <sql-statement> 
            SQL statement 
        </sql-statement> 
        <parameters> 
            <parameter name="Query parameter name in @ notation"> 
                "Query parameter value or expression"
            </parameter>
            <!-- if there are multiple parameters, then add additional parameter elements --> 
        </parameters> 
        <partition-key data-type="string | number | bool | none | null" template="liquid" > 
            "Container partition key" 
        </partition-key> 
        <paging> 
            <max-item-count template="liquid" > 
                Maximum number of items returned by query
            </max-item-count> 
            <continuation-token template="liquid"> 
                Continuation token for paging 
            </continuation-token> 
        </paging>
    </query-request>
    
    <!-- Settings to read item by item ID and optional partition key --> 
    <read-request> 
        <id template="liquid" >
            "Item ID in container"
        </id> 
        <partition-key data-type="string | number | bool | none | null" template="liquid" > 
            "Container partition key" 
        </partition-key>  
    </read-request> 
    
    <!-- Settings to delete item by ID and optional partition key --> 
    <delete-request consistency-level="bounded-staleness | consistent-prefix | eventual | session | strong" pre-trigger="myPreTrigger" post-trigger="myPostTrigger">
        <etag type="entity tag type" template="liquid" > 
            "System-generated entity tag" 
        </etag> 
        <id template="liquid">
            "Item ID in container"
        </id> 
        <partition-key data-type="string | number | bool | none | null" template="liquid"> 
            "Container partition key" 
        </partition-key> 
    </delete-request> 
    
    <!-- Settings to write item -->
    <write-request type="insert | replace | upsert" consistency-level="bounded-staleness | consistent-prefix | eventual | session | strong" pre-trigger="myPreTrigger" post-trigger="myPostTrigger">
        <id template="liquid">
            "Item ID in container"
        </id>
         <partition-key data-type="string | number | bool | none | null" template="liquid"> 
            "Container partition key"
        </partition-key>      
        <etag type="match | no-match" template="liquid" > 
            "System-generated entity tag" 
        </etag>
        <set-body template="liquid" >...set-body policy configuration...</set-body> 
    </write-request>
    
    <response> 
        <set-body>...set-body policy configuration...</set-body> 
        <publish-event>...publish-event policy configuration...</publish-event>
    </response>
    
</cosmosdb-data-source> 

Элементы

Имя Описание Обязательное поле
сведения о подключении Указывает подключение к контейнеру в базе данных Cosmos DB. Да
запрос-запрос Задает параметры для запроса к контейнеру Cosmos DB. Настройка одного из query-request, read-requestdelete-requestилиwrite-request
read-request Задает параметры для запроса чтения в контейнер Cosmos DB. Настройка одного из query-request, read-requestdelete-requestилиwrite-request
delete-request Задает параметры для запроса на удаление контейнера Cosmos DB. Настройка одного из query-request, read-requestdelete-requestилиwrite-request
запрос на запись Задает параметры для запроса на запись в контейнер Cosmos DB. Настройка одного из query-request, read-requestdelete-requestилиwrite-request
ответ При необходимости указывает дочерние политики для настройки ответа сопоставителя. Если это не указано, ответ возвращается из Cosmos DB в формате JSON. нет

Элементы сведений о подключении

Имя Описание Обязательное поле
строка подключения Указывает строка подключения для учетной записи Cosmos DB. Если настроено Управление API управляемое удостоверение, опустите ключ учетной записи. Да
имя базы данных Строка. Имя базы данных Cosmos DB. Да
имя_контейнера Строка. Имя контейнера в базе данных Cosmos DB. Да

Атрибуты строки подключения

Атрибут Описание Обязательное поле По умолчанию.
use-managed-identity Логическое значение. Указывает, следует ли использовать управляемое удостоверение, назначаемое системой Управление API, для подключения к учетной записи Cosmos DB вместо ключа учетной записи в строка подключения. Удостоверение должно быть настроено для доступа к контейнеру Cosmos DB. нет false

Атрибуты запроса-запроса

Атрибут Описание Обязательное поле По умолчанию.
enable-low-precision-order-by Логическое значение. Указывает, следует ли включить свойство запроса EnableLowPrecisionOrderBy в службе Cosmos DB. нет Н/П

Элементы запроса-запроса

Имя Описание Обязательное поле
инструкция sql- Инструкция SQL для запроса. нет
Параметры Список параметров запроса в подэлементах параметров для запроса. нет
ключ секции Ключ секции Cosmos DB для маршрутизации запроса в расположение в контейнере. нет
пейджинг Задает параметры для разделения результатов запроса на несколько страниц. нет

Атрибуты параметра

Атрибут Описание Обязательное поле По умолчанию.
имя Строка. Имя параметра в нотации @. Да Н/П

элементы разбиения по страницам

Имя Описание Обязательное поле
max-item-count Указывает максимальное количество элементов , возвращаемых запросом. Установите значение -1, если вы не хотите поместить ограничение на количество результатов для каждого выполнения запроса. Да
токен продолжения Указывает маркер продолжения для подключения к запросу, чтобы получить следующий набор результатов. Да

Атрибут max-item-count

Атрибут Описание Обязательное поле По умолчанию.
JSON Используется для задания режима шаблонов.max-item-count В настоящее время поддерживается только одно значение:

- liquid max-item-count— использует модуль ликвидного шаблонирования.
нет Н/П

Атрибут токена продолжения

Атрибут Описание Обязательное поле По умолчанию.
JSON Используется для задания режима шаблонов для маркера продолжения. В настоящее время поддерживается только одно значение:

- liquid — маркер продолжения использует модуль ликвидного шаблонирования.
нет Н/П

Элементы read-request

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

Атрибуты delete-request

Атрибут Описание Обязательное поле По умолчанию.
Уровень согласованности Строка. Задает уровень согласованности Cosmos DB запроса на удаление. нет Н/П
предварительная активация Строка. Идентификатор функции предварительного триггера, зарегистрированной в контейнере Cosmos DB. нет Н/П
после триггера Строка. Идентификатор функции после триггера, зарегистрированной в контейнере Cosmos DB. нет Н/П

Элементы delete-request

Имя Описание Обязательное поле
идентификатор Идентификатор элемента, который нужно удалить в контейнере. Да
ключ секции Ключ секции для расположения элемента в контейнере. нет
etag Тег сущности для элемента в контейнере, используемый для управления оптимистическим параллелизмом. нет

Атрибуты запросов на запись

Атрибут Описание Обязательное поле По умолчанию.
тип Тип запроса на запись: insert, replaceили upsert. нет upsert
Уровень согласованности Строка. Задает уровень согласованности Cosmos DB запроса на запись. нет Н/П
Директива indexing- Политика индексирования, которая определяет, как следует индексировать элементы контейнера. нет default
предварительная активация Строка. Идентификатор функции предварительного триггера, зарегистрированной в контейнере Cosmos DB. нет Н/П
после триггера Строка. Идентификатор функции после триггера, зарегистрированной в контейнере Cosmos DB. нет Н/П

Элементы запроса на запись

Имя Описание Обязательное поле
идентификатор Идентификатор элемента в контейнере. Да, когда type есть replace.
etag Тег сущности для элемента в контейнере, используемый для управления оптимистическим параллелизмом. нет
set-body Задает текст в запросе на запись. Если это не указано, аргументы полезных данных запроса сопоставляются в формате JSON. нет

Элементы ответа

Имя Описание Обязательное поле
set-body Задает текст в ответе сопоставителя. Если не указано и возвращаемый JSON содержит имена полей, соответствующие полям в схеме GraphQL, поля автоматически сопоставляются. нет
publish-event Публикует событие в одну или несколько подписок, указанных в схеме API GraphQL. нет

Атрибуты ключа секции

Атрибут Описание Обязательное поле По умолчанию.
тип данных Тип данных ключа секции: string, number, bool, noneили null. нет string
JSON Используется для задания режима шаблонов для ключа секции. В настоящее время поддерживается только одно значение:

- liquid — ключ секции использует обработчик ликвидной шаблона
нет Н/П

Атрибут etag

Атрибут Описание Обязательное поле По умолчанию.
тип Строка. Одно из следующих значений:

- match etag— значение должно соответствовать тегу сущности, созданному системой для элемента.

- no-match etag— значение не требуется для сопоставления тега сущности, созданного системой для элемента.
нет match
JSON Используется для задания режима шаблонов для etag. В настоящее время поддерживается только одно значение:

- liquid — etag использует модуль ликвидной шаблонной шаблоны
нет Н/П

Использование

Примечания об использовании

  • Сведения о настройке сопоставителя и управлении ими с помощью этой политики см. в разделе "Настройка сопоставителя GraphQL".
  • Эта политика вызывается только при разрешении одного поля в типе операции сопоставления в схеме.

Настройка интеграции управляемых удостоверений с Cosmos DB

Управляемое удостоверение, назначаемое системой, можно настроить Управление API для доступа к учетной записи Cosmos DB вместо предоставления ключа учетной записи в строка подключения.

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

Необходимые компоненты

Скрипт Azure CLI для настройки управляемого удостоверения

# Set variables

# Variable for Azure Cosmos DB account name
cosmosName="<MY-COSMOS-DB-ACCOUNT>"

# Variable for resource group name
resourceGroupName="<MY-RESOURCE-GROUP>"

# Variable for subscription
resourceGroupName="<MY-SUBSCRIPTION-NAME>"

# Set principal variable to the value from Managed identities page of API Management instance in Azure portal
principal="<MY-APIM-MANAGED-ID-PRINCIPAL-ID>"

# Get the scope value of Cosmos DB account
 
scope=$(
    az cosmosdb show \
        --resource-group $resourceGroupName \
        --name $cosmosName \
        --subscription $subscriptionName \
        --query id \
        --output tsv
)

# List the built-in Cosmos DB roles
# Currently, the roles aren't visible in the portal

az cosmosdb sql role definition list \
    --resource-group $resourceGroupName \
    --account-name $cosmosName \
    --subscription $subscriptionName \

# Take note of the role you want to assign, such as "Cosmos DB Built-in Data Contributor" in this example

# Assign desired Cosmos DB role to managed identity

az cosmosdb sql role assignment create \
    --resource-group $resourceGroupName \
    --account-name $cosmosName \
    --subscription $subscriptionName \
    --role-definition-name "Cosmos DB Built-in Data Contributor" \
    --principal-id $principal \
    --scope $scope    

Примеры

Запрос запроса Cosmos DB

В следующем примере выполняется разрешение запроса GraphQL с помощью SQL-запроса к контейнеру Cosmos DB.

<cosmosdb-data-source>
    <connection-info>
        <connection-string>
            AccountEndpoint=https://contoso-cosmosdb.
documents.azure.com:443/;AccountKey=CONTOSOKEY;
        </connection-string>
        <database-name>myDatabase</database-name>
        <container-name>myContainer</container-name>
    </connection-info>
    <query-request>
        <sql-statement>SELECT * FROM c </sql-statement>
    </query-request>
</cosmosdb-data-source>

Запрос на чтение Cosmos DB

В следующем примере выполняется разрешение запроса GraphQL с помощью запроса на чтение точек в контейнер Cosmos DB. Подключение к учетной записи Cosmos DB использует управляемое удостоверение, назначаемое системой Управление API экземпляра. Удостоверение должно быть настроено для доступа к контейнеру Cosmos DB.

id Запрос partition-key на чтение передается в качестве параметров запроса и обращается к ней с помощью контекстной переменнойcontext.GraphQL.Arguments["id"].

<cosmosdb-data-source>
    <connection-info>
        <connection-string use-managed-identity="true">
            AccountEndpoint=https://contoso-cosmosdb.
documents.azure.com:443/;
        </connection-string>
        <database-name>myDatabase</database-name>
        <container-name>myContainer</container-name>
    </connection-info>
    <read-request>
        <id>
            @(context.GraphQL.Arguments["id"].ToString())
        </id>
        <partition-key>
            @(context.GraphQL.Arguments["id"].ToString())
    <read-request>
</cosmosdb-data-source>

Запрос на удаление Cosmos DB

В следующем примере устранена мутация GraphQL путем запроса на удаление контейнера Cosmos DB. Запрос id удаления передается в partition-key качестве параметров запроса и обращается к ней с помощью контекстной переменной context.GraphQL.Arguments["id"] .

<cosmosdb-data-source>
    <connection-info>
        <connection-string>
            AccountEndpoint=https://contoso-cosmosdb.
documents.azure.com:443/;AccountKey=CONTOSOKEY;
        </connection-string>
        <database-name>myDatabase</database-name>
        <container-name>myContainer</container-name>
    </connection-info>
    <delete-request>
        <id>
            @(context.GraphQL.Arguments["id"].ToString())
        </id>
        <partition-key>
            @(context.GraphQL.Arguments["id"].ToString())
        </partition-key>
    </delete-request>
</cosmosdb-data-source>

Запрос на запись Cosmos DB

В следующем примере устранена мутация GraphQL путем запроса upsert к контейнеру Cosmos DB. Подключение к учетной записи Cosmos DB использует управляемое удостоверение, назначаемое системой Управление API экземпляра. Удостоверение должно быть настроено для доступа к контейнеру Cosmos DB.

Используемый partition-key для запроса записи передается в качестве параметра запроса и обращается к ней с помощью контекстной переменной context.GraphQL.Arguments["id"] . Запрос upsert имеет операцию предварительного триггера с именем validateInput. Текст запроса сопоставляется с помощью шаблона liquid.

<cosmosdb-data-source>
    <connection-info>
        <connection-string use-managed-identity="true">
            AccountEndpoint=https://contoso-cosmosdb.
documents.azure.com:443/;
        </connection-string>
        <database-name>myDatabase</database-name>
        <container-name>myContainer</container-name>
    </connection-info>
    <write-request type="upsert" pre-trigger="validateInput">
        <partition-key>
            @(context.GraphQL.Arguments["id"].ToString())
        </partition-key>
        <set-body template="liquid">
            {"id" : "{{body.arguments.id}}" ,
            "firstName" : "{{body.arguments.firstName}}",
            "intField" : {{body.arguments.intField}} ,
            "floatField" : {{body.arguments.floatField}} ,
            "boolField" : {{body.arguments.boolField}}}
        </set-body>
    </write-request>
</cosmosdb-data-source>

Создание входных данных параметров для запроса Cosmos DB

В следующих примерах показаны способы создания параметризованных запросов Cosmos DB с помощью выражений политики. Выберите метод на основе формы входных данных параметра.

Примеры основаны на приведенной ниже схеме GraphQL и создают соответствующий параметризованный запрос Cosmos DB.

Пример схемы GraphQL

input personInput {
  id: String!
  firstName: String
}

type Query {
  personsStringParam(stringInput: String): personsConnection
  personsPersonParam(input: personInput): personsConnection
}

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

{
    "query": "query { 
        personsPersonParam(input: { id: \"3\" } { 
        items { id firstName lastName } 
        } 
    }"
}    

Передача объекта JSON (JObject) из выражения

Пример политики

[...]
<query-request>
    <sql-statement>SELECT * FROM c where c.familyId [email protected]</sql-statement>
    <parameters>
        <parameter name="@param">@(context.GraphQL.Arguments["input"])</parameter>
    </parameters>
    </query-request>
[...]

Передача входного типа .NET (строка, int, десятичная, логическое значение) из выражения

Пример политики

[...]
<query-request>
    <sql-statement>SELECT * FROM c where c.familyId =@param</sql-statement>
    <parameters>
        <parameter name="@param">@($"start.{context.GraphQL.Arguments["stringInput"]}")</parameter>
    </parameters>
</query-request>
[...]

Передача значения JSON (JValue) из выражения

Пример политики

[...]
<query-request>
    <sql-statement>SELECT * FROM c where c.familyId =@param</sql-statement>
    <parameters>
        <parameter name="@param">@(context.GraphQL.Arguments["stringInput"])</parameter>
    </parameters>
</query-request>
[...]

Дополнительные сведения о работе с политиками см. в нижеуказанных статьях.