Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Interrogazione in Amazon DocumentDB
Questa sezione spiega tutti gli aspetti delle interrogazioni con Amazon DocumentDB.
Argomenti
Interrogazione di documenti
A volte, potrebbe essere necessario cercare nell'inventario dello store online, in modo che i clienti possano vedere e acquistare ciò che vendi. Eseguire query su una raccolta è relativamente semplice, sia per le ricerche su tutti i documenti della raccolta che per quelle solo sui documenti che soddisfano un determinato criterio.
Per eseguire una query per i documenti, utilizza l'operazione find()
. Il comando find()
ha un parametro per documenti singoli che definisce i criteri da utilizzare nella scelta dei documenti da restituire. L'output di find()
è un documento formattato su una sola riga di testo senza interruzioni di riga. Per formattare il documento di output per facilitare la lettura, utilizza find().pretty()
. Tutti gli esempi di questo argomento utilizzano .pretty()
per formattare l'output.
I seguenti esempi di codice utilizzano i quattro documenti che avete inserito nella example
raccolta nei due esercizi precedenti insertOne()
e insertMany()
che si trovano nella sezione Aggiungere documenti di Lavorare con i documenti.
Argomenti
Recupero di tutti i documenti di una raccolta
Per recuperare tutti i documenti nella raccolta, usa l'operazione find()
con un documento di query vuoto.
La query seguente restituisce tutti i documenti della raccolta example
.
db.example.find( {} ).pretty()
Recupero di documenti che corrispondono a un valore di campo
Per recuperare tutti i documenti che corrispondono a un campo e a un valore, usa l'operazione find()
con un documento di query che identifica i campi e i valori per la corrispondenza.
Usando i documenti precedenti, questa query restituisce tutti i documenti in cui il campo "Item" è uguale a "Pen".
db.example.find( { "Item": "Pen" } ).pretty()
Recupero di documenti che corrispondono a un documento incorporato
Per trovare tutti i documenti che corrispondono a un documento incorporato, utilizza l'operazione find()
con un documento di query che specifica il nome del documento incorporato e tutti i campi e i valori per quel documento incorporato.
Quando si esegue il confronto di un documento incorporato, il documento incorporato del documento deve avere lo stesso nome che ha nella query. Inoltre, i campi e i valori nel documento incorporato devono corrispondere alla query.
La seguente query restituisce solo il documento "Poster Paint". Questo perché "Pen" ha valori diversi per "OnHand
" e "MinOnHand
" e "Spray Paint" ha un ulteriore campo (OrderQnty
) rispetto al documento di query.
db.example.find({"Inventory": { "OnHand": 47, "MinOnHand": 50 } } ).pretty()
Recupero di documenti che corrispondono a un valore di campo in un documento incorporato
Per trovare tutti i documenti che corrispondono a un documento incorporato, utilizza l'operazione find()
con un documento di query che specifica il nome del documento incorporato e tutti i campi e i valori per quel documento incorporato.
Considerati i documenti precedenti, la seguente query utilizza la "dot notation" (notazione col punto) per specificare il documento incorporato e i campi di interesse. Vengono restituiti tutti i documenti che corrispondono a questi campi, indipendentemente da quali altri campi possono essere presenti nel documento incorporato. La query restituisce "Poster Paint" e "Spray Paint" perché entrambi corrispondono ai campi e ai valori specificati.
db.example.find({"Inventory.OnHand": 47, "Inventory.MinOnHand": 50 }).pretty()
Recupero di documenti che corrispondono a un array
Per trovare tutti i documenti che corrispondono a una matrice, utilizzare l'operazione find()
con il nome della matrice richiesta e tutti i valori in quella matrice. La query restituisce tutti i documenti che hanno una matrice con quel nome in cui i valori della matrice sono identici e nello stesso ordine rispetto alla query.
La seguente query restituisce solo "Pen" perché" Poster Paint" ha un ulteriore colore (White) mentre "Spray Paint" ha i colori in un ordine diverso.
db.example.find( { "Colors": ["Red","Green","Blue","Black"] } ).pretty()
Recupero di documenti che corrispondono a un valore in un array
Per trovare tutti i documenti che hanno un valore specifico di matrice, utilizza l'operazione find()
con il nome della matrice e il valore richiesto.
db.example.find( { "Colors": "Red" } ).pretty()
L'operazione precedente restituisce tutti e tre i documenti, in quanto ciascuno di essi dispone di una matrice denominata Colors
e del valore "Red
" all'interno della matrice. Se si specifica il valore "White
", la query restituisce solo "Poster Paint".
Recupero di documenti tramite operatori
La seguente query restituisce tutti i documenti in cui il valore "Inventory.OnHand
" è inferiore a 50.
db.example.find( { "Inventory.OnHand": { $lt: 50 } } )
Per un elenco degli operatori di query supportati, consulta Operatori di interrogazione e proiezione.
Piano di query
Come posso vedere il valore executionStats
per un piano di query?
Quando si determina il motivo per cui una query viene eseguita più lentamente del previsto, può essere utile capire quali sono i valori executionStats
per il piano di query. executionStats
Fornisce il numero di documenti restituiti da una particolare fase (nReturned
), la quantità di tempo di esecuzione trascorso in ogni fase (executionTimeMillisEstimate
) e la quantità di tempo necessaria per generare un piano di query (planningTimeMillis
). È possibile determinare le fasi più dispendiose della query per consentire di concentrare gli sforzi di ottimizzazione dall'output di executionStats
, come illustrato negli esempi di query riportati di seguito. Il parametro executionStats
attualmente non supporta i comandi update
e delete
.
Nota
Amazon DocumentDB emula MongoDB 3.6 API su un motore di database appositamente progettato che utilizza un sistema di storage distribuito, con tolleranza ai guasti e riparazione automatica. Di conseguenza, i piani di interrogazione e l'output di explain()
possono differire tra Amazon DocumentDB e MongoDB. I clienti che desiderano il controllo sul piano di query possono utilizzare l'operatore $hint
per applicare la selezione di un indice preferito.
Esegui la query che vuoi ottimizzare con il comando explain()
come segue.
db.runCommand({explain: {query document}}). explain("executionStats").executionStats;
Di seguito è riportato un esempio di operazione.
db.fish.find({}).limit(2).explain("executionStats");
L'aspetto dell'output di questa operazione è simile al seguente.
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.fish",
"winningPlan" : {
"stage" : "SUBSCAN",
"inputStage" : {
"stage" : "LIMIT_SKIP",
"inputStage" : {
"stage" : "COLLSCAN"
}
}
}
},
"executionStats" : {
"executionSuccess" : true,
"executionTimeMillis" : "0.063",
"planningTimeMillis" : "0.040",
"executionStages" : {
"stage" : "SUBSCAN",
"nReturned" : "2",
"executionTimeMillisEstimate" : "0.012",
"inputStage" : {
"stage" : "LIMIT_SKIP",
"nReturned" : "2",
"executionTimeMillisEstimate" : "0.005",
"inputStage" : {
"stage" : "COLLSCAN",
"nReturned" : "2",
"executionTimeMillisEstimate" : "0.005"
}
}
}
},
"serverInfo" : {
"host" : "enginedemo",
"port" : 27017,
"version" : "3.6.0"
},
"ok" : 1
}
Se si desidera vedere solo il valore executionStats
dalla query di cui sopra, è possibile utilizzare il seguente comando. Per raccolte di piccole dimensioni, il processore di query Amazon DocumentDB può scegliere di non utilizzare un indice se i miglioramenti delle prestazioni sono trascurabili.
db.fish.find({}).limit(2).explain("executionStats").executionStats;
Cache del piano di query
Per ottimizzare le prestazioni e ridurre la durata della pianificazione, Amazon DocumentDB memorizza internamente nella cache i piani di query. Ciò consente di eseguire query con la stessa forma direttamente utilizzando un piano memorizzato nella cache.
Tuttavia, questa memorizzazione nella cache a volte può causare un ritardo casuale per la stessa query; ad esempio, l'esecuzione di una query che richiede in genere un secondo può occasionalmente impiegare dieci secondi. Ciò è dovuto al fatto che, nel tempo, l'istanza del lettore ha memorizzato nella cache varie forme della query, consumando così memoria. Se si verifica questa lentezza casuale, non è necessario eseguire alcuna azione per liberare la memoria: il sistema gestirà l'utilizzo della memoria al posto dell'utente e, una volta raggiunta una certa soglia, la memoria verrà rilasciata automaticamente.
Spiega i risultati
Se desideri restituire informazioni sui piani di query, Amazon DocumentDB supporta la modalità verbosità. queryPlanner
I explain
risultati restituiscono il piano di query selezionato scelto dall'ottimizzatore in un formato simile al seguente:
{ "queryPlanner" : { "plannerVersion" : <int>, "namespace" : <string>, "winningPlan" : { "stage" : <STAGE1>, ... "inputStage" : { "stage" : <STAGE2>, ... "inputStage" : { ... } } } } }
Le seguenti sezioni definiranno i explain
risultati comuni.
Argomenti
Fase di scansione e filtro
L'ottimizzatore può scegliere una delle seguenti scansioni:
COLLSCAN
Questa fase è una scansione sequenziale di raccolta.
{ "stage" : "COLLSCAN" }
IXSCAN
Questa fase esegue la scansione delle chiavi dell'indice. L'ottimizzatore può recuperare il documento in questa fase e ciò può comportare una fase aggiunta in un secondo momentoFETCH.
db.foo.find({"a": 1}) { "stage" : "IXSCAN", "direction" : "forward", "indexName" : <idx_name> }
FETCH
Se l'ottimizzatore ha recuperato i documenti in una fase diversa da quellaIXSCAN, il risultato includerà una fase. FETCH Ad esempio, la IXSCAN query precedente può risultare da una combinazione di FETCH e IXSCAN fasi:
db.foo.find({"a": 1}) { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "indexName" : <idx_name> } }
IXONLYSCANesegue la scansione solo della chiave dell'indice. La creazione di indici composti non lo eviterà. FETCH
Intersezione dell'indice
IXAND
Amazon DocumentDB può includere uno IXAND stage con una inputStages matrice che indica IXSCAN se può utilizzare l'intersezione degli indici. Ad esempio, potremmo vedere risultati come:
{ "stage" : "FETCH", "inputStage" : { "stage" : "IXAND", "inputStages" : [ { "stage" : "IXSCAN", "indexName" : "a_1" }, { "stage" : "IXSCAN", "indexName" : "b_1" } ] } }
Unione dell'indice
IXOR
Analogamente all'intersezione degli indici, Amazon DocumentDB può IXOR
includere uno stage con inputStages
un array per l'$or
operatore.
db.foo.find({"$or": [{"a": {"$gt": 2}}, {"b": {"$lt": 2}}]})
Per la query precedente, l'output di spiegazione potrebbe essere simile al seguente:
{ "stage" : "FETCH", "inputStage" : { "stage" : "IXOR", "inputStages" : [ { "stage" : "IXSCAN", "indexName" : "a_1" }, { "stage" : "IXSCAN", "indexName" : "b_1" } ] } }
Intersezione/unione di indici multipli
Amazon DocumentDB può combinare più fasi di intersezione o unione di indici e recuperare il risultato. Per esempio:
{ "stage" : "FETCH", "inputStage" : { "stage" : "IXOR", "inputStages" : [ { "stage" : "IXSCAN", ... }, { "stage" : "IXAND", "inputStages" : [ { "stage" : "IXSCAN", ... }, { "stage" : "IXSCAN", ... } ] } ] } }
L'utilizzo dell'intersezione dell'indice o degli stadi di unione non è influenzato dal tipo di indice (sparso, composto, ecc.).
Indice composto
L'utilizzo dell'indice composto di Amazon DocumentDB non è limitato nei sottoinsiemi iniziali dei campi indicizzati; può utilizzare l'indice con la parte del suffisso, ma potrebbe non essere molto efficiente.
Ad esempio, l'indice composto di { a: 1, b: -1 }
può supportare tutte e tre le query seguenti:
db.orders.find( { a: 1 } } )
db.orders.find( { b: 1 } } )
db.orders.find( { a: 1, b: 1 } } )
Fase di ordinamento
Se esiste un indice sulle chiavi di ordinamento richieste, Amazon DocumentDB può utilizzare l'indice per ottenere l'ordine. In tal caso, il risultato non includerà una SORT
fase, ma piuttosto una IXSCAN
fase. Se l'ottimizzatore preferisce un ordinamento semplice, includerà una fase come questa:
{ "stage" : "SORT", "sortPattern" : { "a" : 1, "b" : -1 } }
Fase a gironi
Amazon DocumentDB supporta due diverse strategie di gruppo:
SORT_AGGREGATE
: Ordinamento aggregato su disco.HASH_AGGREGATE
: aggregato di hash in memoria.