Esecuzione di query sulle risorse di Azure Cosmos DB con l'API REST
Azure Cosmos DB è un database multimodello distribuito a livello globale con supporto per più API. Questo articolo descrive come usare REST per eseguire query sulle risorse usando l'API SQL.
Come si esegue una query su una risorsa usando REST?
Per eseguire una query SQL su una risorsa, eseguire le operazioni seguenti:
- Eseguire un
POST
metodo su un percorso di risorsa usando JSON con laquery
proprietà impostata sulla stringa di query SQL e la proprietà "parameters" impostata sulla matrice di valori dei parametri facoltativi. - Impostare l'intestazione
x-ms-documentdb-isquery
suTrue
. - Impostare l'intestazione
Content-Type
suapplication/query+json
.
Per un esempio che illustra come eseguire una query SQL su una risorsa con .NET, vedere REST from .NET Sample (REST from .NET Sample).
Esempio
Di seguito è riportato un esempio di operazione di query REST su risorse documento. In questo esempio si desidera trovare tutti i documenti che contengono "Don" come autore.
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": []
}
Dettagli delle richieste
Metodo | URI richiesta |
---|---|
POST | Obbligatorio. Tipo di autenticazione e token di firma. Per questa operazione è consentito solo il token della chiave master. Per altre informazioni, vedere Controllo di accesso sulle risorse di Cosmos DB. |
Intestazioni richiesta
La tabella seguente contiene le intestazioni comuni usate per eseguire operazioni di query.
Intestazione standard | Descrizione |
---|---|
Autorizzazione | Obbligatorio. Tipo di autenticazione e token di firma. Per questa operazione è consentito solo il token della chiave master. Per altre informazioni, vedere Controllo di accesso sulle risorse di Cosmos DB. |
Content-Type | Obbligatorio. Deve essere impostata su application/query+json. |
Accettare | Facoltativo. Al momento, Cosmos DB restituisce sempre il payload della risposta in formato JSON standard. Il client deve essere in grado di accettare il corpo della risposta nel formato JSON standard. |
User-Agent | Facoltativo. Agente utente che esegue la richiesta. Il formato consigliato è {user agent name}/{version}. Ad esempio, l'SDK .NET dell'API SQL imposta la stringa User-Agent su Microsoft.Document.Client/1.0.0.0. |
Intestazione personalizzata | Descrizione |
---|---|
x-ms-date | Obbligatorio. Data della richiesta, come specificato in RFC 1123. Il formato della data è espresso nell'ora UTC (Coordinated Universal Time), ad esempio. Ven, 08 aprile 2015 03.52.31 GMT. |
x-ms-documentdb-isquery | Obbligatorio. Questa proprietà deve essere impostata su true. |
x-ms-max-item-count | Facoltativo. Per scorrere un set di risultati, impostare questa intestazione sul numero massimo di elementi da restituire in una singola pagina. |
x-ms-continuation | Facoltativo. Per passare alla pagina di elementi successiva, impostare questa intestazione per il token di continuazione per la pagina successiva. |
x-ms-version | Facoltativo. Versione del servizio REST di Cosmos DB. Quando l'intestazione non è specificata, si usa la versione più recente. Per altre informazioni, vedere Informazioni di riferimento sull'API REST di Azure Cosmos DB. |
x-ms-documentdb-query-enable-scan | Facoltativo. Usare l'analisi degli indici per elaborare la query se il percorso di indice del tipo corretto non è disponibile. |
x-ms-session-token | Facoltativo. Token di sessione per la richiesta. Usato per la coerenza della sessione. |
x-ms-partition-key | Facoltativo. Se specificato, la query viene eseguita solo su documenti che corrispondono al valore della chiave di partizione nell'intestazione. |
x-ms-documentdb-query-enablecrosspartition | Facoltativo. Deve essere impostato su true per tutte le query che non filtrano in base a una singola chiave di partizione. Le query che filtrano in base a un singolo valore della chiave di partizione verranno eseguite su una sola partizione anche se è impostata su true. |
x-ms-documentdb-populatequerymetrics |
Facoltativo. Deve essere impostato su True per restituire le metriche delle query |
Corpo della richiesta
Il corpo della richiesta deve essere un documento JSON valido contenente la query e i parametri SQL. Se l'input è una sintassi SQL non corretta o non valida, l'operazione ha esito negativo e restituisce l'errore 400 (Richiesta non valida).
Si otterrà anche una richiesta 400 non valida se non è possibile gestire una query dal gateway.
Proprietà | Descrizione |
---|---|
query | Obbligatorio. Stringa di query SQL per la query. Per altre informazioni, vedere Informazioni di riferimento sulla sintassi SQL di Azure Cosmos DB. |
parametri | Obbligatorio. Una matrice JSON di parametri specificati come coppie nome/valore. La matrice di parametri può contenere da zero a molti parametri. Ogni parametro deve avere i seguenti valori:name: il nome del parametro. I nomi dei parametri devono essere valori letterale stringa e iniziare con ‘@’.value: il valore del parametro. Possono essere valori JSON validi (stringa, numero, oggetto, matrice, valore booleano o null). |
Esempio di richiesta
Nell'esempio seguente viene eseguita una richiesta SQL con parametri con un parametro stringa per @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"}
]
}
Per altre informazioni sulle query SQL, vedere Query SQL per Azure Cosmos DB.
Dettagli della risposta
Di seguito sono riportati i codici di stato comuni restituiti dall'operazione. Per informazioni sui codici di stato degli errori, vedere Codici di stato HTTP per Azure Cosmos DB.
Codice | Descrizione |
---|---|
200 Ok | L'operazione è riuscita. |
400 - Richiesta non valida | La sintassi dell'istruzione SQL non è corretta. |
401 - Non autorizzato | Non è stata impostata l'intestazione Authorization o x-ms-date. Il codice 401 viene restituito anche quando l'intestazione Authorization è impostata su un token di autorizzazione non valido. |
403 - Accesso negato | Il token di autorizzazione è scaduto. |
404 - Non trovato | La raccolta non è più una risorsa. Ad esempio, è possibile che la risorsa sia stata eliminata. |
Intestazioni della risposta
Questa operazione restituisce le seguenti intestazioni comuni. È possibile che vengano restituite altre intestazioni comuni e standard.
Intestazione standard | Descrizione |
---|---|
Content-Type | Il valore di Content-Type è application/json. Cosmos DB restituisce sempre il corpo della risposta in formato JSON standard. |
Data | Data e ora dell'operazione di risposta. Il formato di data/ora è conforme al formato di data/ora della [RFC1123], espresso in UTC. |
Intestazione personalizzata | Descrizione |
---|---|
x-ms-item-count | Numero di elementi restituiti dall'operazione. |
x-ms-continuation | Si tratta di una stringa opaca restituita quando la query contiene potenzialmente più elementi da recuperare. È possibile includere x-ms-continuation nelle richieste successive come intestazione della richiesta di ripresa dell'esecuzione della query. |
x-ms-request-charge | È il numero di unità richiesta utilizzate dall'operazione. Per altre informazioni sulle unità richiesta, vedere Unità richiesta in Azure Cosmos DB. |
x-ms-activity-id | È un identificatore univoco per l'operazione. Può essere usato per tracciare l'esecuzione delle richieste di Cosmos DB. |
x-ms-session-token | Token di sessione da usare per le richieste successive. Usato per la coerenza della sessione. |
Corpo della risposta
Il corpo della risposta per l'operazione di query è costituito dall'ID risorsa (_rid) della risorsa padre della risorsa su cui viene eseguita la query e dalla matrice di risorse contenente le proprietà delle risorse per la proiezione e la selezione. Come nell'esempio, se una query è stata eseguita sul percorso docs della raccolta con un valore _rid XP0mAJ3H-AA=, la risposta sarà la seguente:
{"_rid":" XP0mAJ3H-AA=","Documents": [ …. …. ],"_count":10}
Proprietà | Descrizione |
---|---|
_rid | ID risorsa per la raccolta utilizzata all'interno della query. |
_Conteggio | Numero di elementi restituiti. |
Resource array | Matrice contenente i risultati della query. |
Compilazione del corpo della richiesta di query
La richiesta di query deve essere un documento JSON valido contenente una proprietà query che include una stringa di query SQL e una proprietà parameters che include una matrice di parametri facoltativi. Ogni parametro deve avere una proprietà name e una proprietà value per i parametri specificati nella query. I nomi di parametri devono iniziare con il carattere “@”. I valori possono essere qualsiasi valore JSON valido come stringhe, interi, booleani e Null.
È valido specificare solo un subset di parametri specificati nel testo della query . Le espressioni che fanno riferimento a questi parametri non specificati restituiranno undefined. È anche possibile specificare parametri aggiuntivi che non vengono usati nel testo di query.
Di seguito sono illustrati alcuni esempi di richieste di query valide. Ad esempio, la query seguente ha un singolo parametro @id.
{
"query": "select * from docs d where d.id = @id",
"parameters": [
{"@id": "newdoc"}
]
}
L'esempio seguente include due parametri, uno con un valore di stringa e un altro con un valore Integer.
{
"query": "select * from docs d where d.id = @id and d.prop = @prop",
"parameters": [
{"@id": "newdoc"},
{"@prop": 5}
]
}
L'esempio seguente usa i parametri in una clausola SELECT, oltre a una proprietà accessibile tramite il nome di parametro come parametro.
{
"query": "select @id, d[@propName] from docs d",
"parameters": [
{"@id": "newdoc"},
{"@propName": "prop"}
]
}
Query che non possono essere gestite dal gateway
Qualsiasi query che richiede lo stato tra le continuazioni non può essere gestita dal gateway. ad esempio:
- TOP
- ORDER BY
- OFFSET LIMIT
- Aggregazioni
- DISTINCT
- GROUP BY
Le query che possono essere gestite dal gateway includono:
- Proiezioni semplici
- Filtri
Quando viene restituita una risposta per una query che non può essere servita dal gateway, conterrà il codice di stato 400 (BadRequest) e il messaggio seguente:
{"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}]}"}
Paginazione dei risultati della query
Le richieste di query supportano la paginazione tramite le intestazioni x-ms-max-item-count e x-ms-continuation request. L'intestazione x-ms-max-item-count specifica il numero massimo di valori che possono essere restituiti dall'esecuzione della query. Può essere un numero compreso tra 1 e 1000 ed è configurato con un valore predefinito pari a 100.
Dai risultati dell'esecuzione le query restituiranno un valore compreso tra zero e il valore massimo specificato per x-ms-max-item-count. Il risultato della query include un'intestazione x-ms-item-count che specifica il numero effettivo di documenti restituiti dalla query. Se sono presenti altri risultati recuperabili dalla query, la risposta includerà un valore non vuoto per l'intestazione x-ms-continuation.
I client sono in grado di recuperare pagine successive di risultati mediante la ripetizione dell'intestazione x-ms-continuation come altra richiesta. Per leggere i risultati, i client devono ripetere questo processo finché non verrà restituita un'intestazione x-ms-continuation vuota.
Le esecuzioni di query di Cosmos DB sono senza stato sul lato server e possono essere riprese in qualsiasi momento usando l'intestazione x-ms-continuation . Il valore x-ms-continuation usa l'ultimo ID risorsa del documento elaborato (_rid) per tenere traccia dello stato di esecuzione. Pertanto, se i documenti vengono eliminati e reinseriti tra il recupero di pagine, i documenti potrebbero essere potenzialmente esclusi da uno dei batch di query. È tuttavia possibile che il comportamento dell'intestazione x-ms-continuation venga modificato in un futuro aggiornamento del servizio.