

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
<a name="querying"></a>

Questa sezione spiega tutti gli aspetti delle interrogazioni con Amazon DocumentDB.

**Topics**
+ [Interrogazione di documenti](#querying.docs)
+ [Piano di query](#querying.queryplan)
+ [Spiega i risultati](#querying.explainresults)
+ [Pianificatore di query v2](query-planner.md)
+ [Pianificatore di query v3](query-planner-v3.md)
+ [Dati geospaziali](geospatial.md)
+ [Indice parziale](partial-index.md)
+ [Ricerca testuale](text-search.md)

## Interrogazione di documenti
<a name="querying.docs"></a>

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](https://docs.aws.amazon.com//documentdb/latest/devguide/document-database-working-with-documents.html) i documenti.

**Topics**
+ [Recupero di tutti i documenti](#querying.alldocs)
+ [Valori di campo corrispondenti](#querying.matchfield)
+ [Documenti incorporati](#querying.embedded-doc)
+ [Valori dei campi nei documenti incorporati](#querying.embedded-docs-field)
+ [Corrispondenza a un array](#querying.array)
+ [Valori corrispondenti in una matrice](#querying.array-values)
+ [Utilizzo degli operatori](#querying.operators)

### Recupero di tutti i documenti di una raccolta
<a name="querying.alldocs"></a>

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
<a name="querying.matchfield"></a>

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
<a name="querying.embedded-doc"></a>

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
<a name="querying.embedded-docs-field"></a>

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
<a name="querying.array"></a>

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
<a name="querying.array-values"></a>

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
<a name="querying.operators"></a>

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](mongo-apis.md#mongo-apis-query). 

## Piano di query
<a name="querying.queryplan"></a>

### Come posso visualizzare gli `ExecutionStats` per un piano di query?
<a name="querying.queryplan-executionStats"></a>

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 della query che richiedono più tempo per concentrare gli sforzi di ottimizzazione a partire dall'output di`executionStats`, come illustrato nei seguenti esempi di query. Il parametro `executionStats` attualmente non supporta i comandi `update` e `delete`.

**Nota**  
Amazon DocumentDB emula l'API MongoDB 3.6 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
<a name="querying.queryplan-cached"></a>

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
<a name="querying.explainresults"></a>

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.

**Topics**
+ [Fase di scansione e filtro](#querying.explainresults-scan-filter)
+ [Intersezione dell'indice](#querying.explainresults-index-intersection)
+ [Unione dell'indice](#querying.explainresults-index-union)
+ [Indice multiplo intersection/union](#querying.explainresults-multiple-index-union)
+ [Indice composto](#querying.explainresults-compound-index)
+ [Fase di ordinamento](#querying.explainresults-sort)
+ [Fase a gironi](#querying.explainresults-group)

### Fase di scansione e filtro
<a name="querying.explainresults-scan-filter"></a>

L'ottimizzatore può scegliere una delle seguenti scansioni:

COLLSCAN

Questa fase è una scansione sequenziale di raccolta.

```
{
    "stage" : "COLLSCAN"
}
```

ISCAN

Questa fase esegue la scansione delle chiavi dell'indice. L'ottimizzatore può recuperare il documento in questa fase e ciò può comportare una fase FETCH aggiunta successivamente.

```
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 IXSCAN, il risultato includerà una fase FETCH. Ad esempio, la query IXSCAN di cui sopra può generare una combinazione di fasi FETCH e IXSCAN:

```
db.foo.find({"a": 1})
{
    "stage" : "FETCH",
    "inputStage" : {
        "stage" : "IXSCAN",
        "indexName" : <idx_name>
    }
}
```

IXONLYSCAN analizza solo la chiave dell'indice. La creazione di indici composti non eviterà FETCH.

### Intersezione dell'indice
<a name="querying.explainresults-index-intersection"></a>

IXAND

Amazon DocumentDB può includere uno stage IXAND con un array InputStages di IXSCAN se può utilizzare l'intersezione degli indici. Ad esempio, possiamo vedere risultati come:

```
{
    "stage" : "FETCH",
    "inputStage" : {
        "stage" : "IXAND",
        "inputStages" : [
            {
                "stage" : "IXSCAN",
                "indexName" : "a_1"
            },
            {
                "stage" : "IXSCAN",
                "indexName" : "b_1"
            }
        ]
    }
}
```

### Unione dell'indice
<a name="querying.explainresults-index-union"></a>

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"
            }
        ]
    }
}
```

### Indice multiplo intersection/union
<a name="querying.explainresults-multiple-index-union"></a>

Amazon DocumentDB può combinare più fasi di intersezione o unione di indici e recuperare il risultato. 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
<a name="querying.explainresults-compound-index"></a>

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
<a name="querying.explainresults-sort"></a>

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
<a name="querying.explainresults-group"></a>

Amazon DocumentDB supporta due diverse strategie di gruppo:
+ `SORT_AGGREGATE`: Ordinamento aggregato su disco.
+ `HASH_AGGREGATE`: aggregato di hash in memoria.