Consulta de recursos de Azure Cosmos DB mediante la API REST
Azure Cosmos DB es una base de datos multimodelo distribuida globalmente que admite varias API. En este artículo se describe cómo usar REST para consultar recursos mediante la API de SQL.
¿Cómo se puede consultar un recurso con REST?
Para realizar una consulta SQL en un recurso, haga lo siguiente:
- Ejecute un
POST
método en una ruta de acceso de recurso mediante JSON con laquery
propiedad establecida en la cadena de consulta SQL y la propiedad "parameters" establecida en la matriz de valores de parámetro opcionales. - Establezca el encabezado
x-ms-documentdb-isquery
enTrue
. - Establezca el encabezado
Content-Type
enapplication/query+json
.
Para obtener un ejemplo en el que se muestra cómo realizar una consulta SQL en un recurso mediante .NET, consulte REST del ejemplo de .NET.
Ejemplo
A continuación se muestra un ejemplo de operación de consulta de REST en los recursos del documento. En este ejemplo, nos gustaría buscar todos los documentos que tienen a "Don" como autor.
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": []
}
Detalles de la solicitud
Método | URI de solicitud |
---|---|
POST | Requerido. El tipo de autenticación y el token de firma. Solo se permite el token de clave maestra para esta operación. Para más información, consulte Access Control en recursos de Cosmos DB. |
Encabezados de solicitud
La tabla siguiente contiene los encabezados comunes utilizados para realizar operaciones de consulta.
Encabezado estándar | Descripción |
---|---|
Autorización | Requerido. El tipo de autenticación y el token de firma. Solo se permite el token de clave maestra para esta operación. Para más información, consulte Access Control en recursos de Cosmos DB. |
Content-Type | Requerido. Debe establecerse en application/query+json. |
Aceptación | Opcional. En este momento, Cosmos DB siempre devuelve la carga de respuesta en formato JSON estándar. El cliente debe ser capaz de aceptar el cuerpo de respuesta en el formato JSON estándar. |
User-Agent | Opcional. El agente de usuario que realiza la solicitud. El formato recomendado es {nombre del agente de usuario}/{versión}. Por ejemplo, el SDK de .NET de la API de SQL establece la cadena de User-Agent en Microsoft.Document.Client/1.0.0.0. |
Encabezado personalizado | Descripción |
---|---|
x-ms-date | Requerido. La fecha de la solicitud, tal como se especifica en RFC 1123. El formato de fecha se expresa en hora universal coordinada (UTC), por ejemplo. viernes, 8 de agosto de 2015 03:52:31 GMT. |
x-ms-documentdb-isquery | Requerido. Esta propiedad debe establecerse en true. |
x-ms-max-item-count | Opcional. Para desplazarse a través de un conjunto de resultados, establezca este encabezado en el número máximo de elementos que se devuelven en una sola página. |
x-ms-continuation | Opcional. Para navegar a la siguiente página de elementos, establezca este encabezado en el token de continuación de la página siguiente. |
x-ms-version | Opcional. La versión del servicio REST de Cosmos DB. Cuando no se proporciona el encabezado, se utiliza la última versión. Para más información, consulte Referencia de la API REST de Azure Cosmos DB. |
x-ms-documentdb-query-enable-scan | Opcional. Use un recorrido de índice para procesar la consulta si la ruta de acceso al índice correcto del tipo no está disponible. |
x-ms-session-token | Opcional. El token de sesión para la solicitud. Se usa para coherencia de la sesión. |
x-ms-partition-key | Opcional. Si se especifica, la consulta solo se ejecuta en documentos que coinciden con el valor de clave de partición en el encabezado. |
x-ms-documentdb-query-enablecrosspartition | Opcional. Debe establecerse en true para las consultas que no filtran por una sola clave de partición. Las consultas que filtran por un solo valor de clave de partición se ejecutarán en una sola partición, incluso si se establece en true. |
x-ms-documentdb-populatequerymetrics |
Opcional. Debe establecerse True en para devolver métricas de consulta. |
Cuerpo de la solicitud
El cuerpo de la solicitud debe ser un documento JSON válido que contenga los parámetros y la consulta SQL. Si la entrada tiene una sintaxis SQL no válida o incorrecta, la operación generará un error 400 Solicitud incorrecta.
También obtendrá una solicitud incorrecta 400 si la puerta de enlace no puede atender una consulta.
Propiedad | Descripción |
---|---|
Query | Requerido. La cadena de consulta SQL para la consulta. Para más información, consulte Referencia de sintaxis sql de Azure Cosmos DB. |
parámetros | Requerido. Una matriz JSON de parámetros especificada como pares nombre-valor. La matriz de parámetros puede contener de cero a muchos parámetros. Cada parámetro debe tener los siguientes valores:name: el nombre del parámetro. Los nombres de parámetro deben ser literales de cadena válidos y comenzar por "@". value: el valor del parámetro . Puede ser cualquier valor JSON válido (cadena, número, objeto, matriz, booleano o nulo). |
Solicitud de ejemplo
En el ejemplo siguiente se realiza una solicitud SQL parametrizada con un parámetro de cadena para @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"}
]
}
Para más información sobre las consultas SQL, consulte Consultas SQL para Azure Cosmos DB.
Detalles de la respuesta
Los siguientes son códigos de estado comunes devueltos por esta operación. Para obtener información sobre los códigos de estado de error, consulte Códigos de estado HTTP para Azure Cosmos DB.
Código | Descripción |
---|---|
200 Ok | La operación se realizó correctamente. |
400 - Solicitud incorrecta | La sintaxis de la instrucción SQL es incorrecta. |
401 No autorizado | El encabezado Authorization o x-ms-date no se han establecido. 401 también se devuelve cuando el encabezado Authorization está configurado como un token de autorización no válido. |
(403) Prohibido | El token de autorización expiró. |
404 No encontrado | La colección ya no es un recurso. Por ejemplo, el recurso puede haberse eliminado. |
Encabezados de respuesta
Esta operación devuelve los siguientes encabezados comunes. Puede que se devuelvan más encabezados estándar y comunes.
Encabezado estándar | Descripción |
---|---|
Content-Type | El Content-Type es application/json. Cosmos DB siempre devuelve el cuerpo de la respuesta en formato JSON estándar. |
Date | La fecha y la hora de la operación de respuesta. Este formato de fecha hora se ajusta al formato de hora y fecha de RFC 1123 expresado en hora universal coordinada. |
Encabezado personalizado | Descripción |
---|---|
x-ms-item-count | El número de elementos devueltos por la operación. |
x-ms-continuation | Es una cadena opaca devuelta cuando la consulta tiene potencialmente más elementos que se van a recuperar. x-ms-continuation se puede incluir en solicitudes subsiguientes como un encabezado de solicitud para reanudar la ejecución de la consulta. |
x-ms-request-charge | Es el número de unidades de solicitud (RU) consumidas por la operación. Para más información sobre las unidades de solicitud, consulte Unidades de solicitud en Azure Cosmos DB. |
x-ms-activity-id | Es un identificador único para la operación. Se puede usar para realizar el seguimiento de la ejecución de solicitudes de Cosmos DB. |
x-ms-session-token | El token de sesión que se usará para solicitudes subsiguientes. Se usa para coherencia de la sesión. |
Cuerpo de la respuesta
El cuerpo de respuesta para la operación de consulta consta del _rid del recurso principal del recurso que se consulta y la matriz de recursos que contiene las propiedades del recurso para la proyección y la selección. Según el ejemplo, si se realizó una consulta en la ruta docs de la recopilación con un _rid de XP0mAJ3H-AA=,, la respuesta sería la siguiente:
{"_rid":" XP0mAJ3H-AA=","Documents": [ …. …. ],"_count":10}
Propiedad | Descripción |
---|---|
_rid | Identificador de recurso de la colección usada en la consulta. |
_Contar | Número de elementos devueltos. |
Matriz de recursos | La matriz que contiene los resultados de consulta. |
Creación del cuerpo de solicitud de consulta
La solicitud de consulta debe ser un documento JSON válido que contiene una propiedad query que contiene una cadena de consulta SQL válida y una propiedad parameters que contiene una matriz de parámetros opcionales. Cada parámetro debe tener una propiedad name y value de parámetros que se especifican dentro de la consulta. Los nombres de parámetro deben comenzar con el carácter "@". Los valores pueden ser cualquier valor JSON válido: cadenas, enteros, booleanos y nulos.
Es válido especificar solo un subconjunto de parámetros especificados en el texto de la consulta . Las expresiones que hacen referencia a estos parámetros no especificados evaluarán a undefined. También es válido para especificar parámetros adicionales que no se usan dentro del texto query.
A continuación aparecen algunos ejemplos de solicitudes de consulta válida. Por ejemplo, la consulta siguiente tiene un único parámetro @id.
{
"query": "select * from docs d where d.id = @id",
"parameters": [
{"@id": "newdoc"}
]
}
El siguiente ejemplo tiene dos parámetros, uno con un valor de cadena y otro con un valor entero.
{
"query": "select * from docs d where d.id = @id and d.prop = @prop",
"parameters": [
{"@id": "newdoc"},
{"@prop": 5}
]
}
El siguiente ejemplo usa parámetros dentro de la cláusula SELECT, así como una propiedad a la que se tiene acceso a través del nombre de parámetro como parámetro.
{
"query": "select @id, d[@propName] from docs d",
"parameters": [
{"@id": "newdoc"},
{"@propName": "prop"}
]
}
Consultas que la puerta de enlace no puede atender
La puerta de enlace no puede atender cualquier consulta que requiera estado entre las continuaciones. Esto incluye:
- TOP
- ORDER BY
- OFFSET LIMIT
- Agregados
- DISTINCT
- GROUP BY
Las consultas que puede atender la puerta de enlace incluyen:
- Proyecciones simples
- Filtros
Cuando se devuelve una respuesta para una consulta que no puede servir la puerta de enlace, contendrá el código de estado 400 (BadRequest) y el siguiente mensaje:
{"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}]}"}
Paginación de resultados de consulta
Las solicitudes de consulta admiten la paginación mediante los encabezados x-ms-max-item-count y x-ms-continuation request. El encabezado x-ms-max-item-count especifica el número máximo de valores que la ejecución de consulta puede devolver. El valor puede estar entre 1 y 1000 y está configurado con un valor predeterminado de 100.
Las consultas devolverán desde un valor de cero hasta el valor de x-ms-max-item-count máximo especificado desde los resultados de la ejecución. El resultado de la consulta incluye un encabezado x-ms-item-count que especifica el número real de documentos que devuelve la consulta. Si hay resultados adicionales que se pudieran recuperar desde la consulta, la respuesta incluye un valor no vacío para el encabezado x-ms-continuation.
Los clientes pueden capturar páginas subsiguientes de resultados si reitera el encabezado x-ms-continuation como otra solicitud. Para leer todos los resultados, los clientes deben repetir este proceso hasta que se devuelva un x-ms-continuation vacío.
Las ejecuciones de consultas de Cosmos DB no tienen estado en el lado servidor y se pueden reanudar en cualquier momento mediante el encabezado x-ms-continuation . El valor x-ms-continuation usa identificador de recursos del último documento procesado (_rid) para hacer seguimiento del progreso de la ejecución. Por lo tanto, si los documentos se eliminan y se vuelven a insertar entre la captura de páginas, los documentos podrían excluirse de cualquiera de los lotes de consulta. Sin embargo, el comportamiento y el formato el encabezado x-ms-continuation podría cambiar en una actualización de servicio futura.