Questa pagina descrive come gestire gli indici. Per saperne di più sugli indici, consulta la panoramica degli indici.
Prima di iniziare
Prima di poter creare un indice in Cloud Firestore, assicurati di disporre di uno dei seguenti ruoli:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Per concedere un ruolo, consulta Concedi un singolo ruolo. Per saperne di più sui ruoli Cloud Firestore e sulle autorizzazioni associate, consulta Ruoli predefiniti.
Se hai definito ruoli personalizzati, assegna tutte le seguenti autorizzazioni per creare indici:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
Crea un indice
Per creare un indice, completa i seguenti passaggi:
API MongoDB
Utilizza il metodo createIndex() per creare un indice. Ad esempio:
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
È supportata anche la creazione di indici con
db.runCommand(), con al massimo un indice.db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
Tieni presenti le seguenti limitazioni:
- Puoi creare un solo indice per richiesta.
db.collection.createIndexes()non è supportato. - Gli audit log per la creazione di indici con l'API MongoDB utilizzano il nome del metodo
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Per le opzioni di indice supportate, vedi Indici e proprietà degli indici.
Firebase console
-
Nella console Firebase, vai alla pagina Database Firestore.
- Seleziona un database dall'elenco.
- Nella scheda Indici, fai clic su Crea indice.
- Inserisci un ID raccolta.
- Aggiungi uno o più percorsi dei campi e seleziona un'opzione di indice per ciascuno.
- Seleziona un'opzione di presenza del campo, non sparsa o sparsa.
- Se vuoi, puoi impostare l'opzione Indice multikey.
- Fai clic su Crea.
- Il nuovo indice viene visualizzato nell'elenco degli indici e Cloud Firestore inizia a crearlo. Una volta creato l'indice, vedrai un segno di spunta verde accanto. Se l'indice non viene creato, consulta la sezione Errori di creazione dell'indice per possibili cause.
gcloud CLI
Per creare un indice, utilizza il
comando
gcloud firestore indexes composite create. Imposta api-scope su mongodb-compatible-api.
gcloud firestore indexes composite create \ --database='DATABASE_ID' \ --collection-group=COLLECTION \ --field-config=FIELD_CONFIGURATION \ --query-scope=collection-group \ --density=dense \ --api-scope=mongodb-compatible-api
Sostituisci quanto segue:
- DATABASE_ID: un ID database.
- COLLECTION: un nome di raccolta.
- FIELD_CONFIGURATION: una configurazione del campo. Per ogni campo,
aggiungi
--field-config=field-path=. Ad esempio:--field-config=field-path=user-id,order=descending \ --field-config=field-path=score,order=descendingPer saperne di più sulla configurazione di questi campi, consulta
--field-config.
Per creare un indice sparso, imposta --density=sparse-any.
Per creare un indice multikey, aggiungi il flag --multikey.
Per creare un indice univoco, aggiungi il flag --unique.
Terraform
Utilizza la risorsa google_firestore_index e imposta api_scope su MONGODB_COMPATIBLE_API e query_scope su COLLECTION_GROUP.
resource "google_firestore_index" "index" { database = "DATABASE_ID" collection = "COLLECTION" api_scope = "MONGODB_COMPATIBLE_API" query_scope = "COLLECTION_GROUP" // You can include multiple field blocks fields { field_path = "FIELD_PATH" order = "ORDER" } // Optional multikey = true density = "DENSITY" }
Sostituisci quanto segue:
- DATABASE_ID: L'ID del database scelto
- COLLECTION: il nome della raccolta da indicizzare
- FIELD_PATH: il nome del campo da indicizzare
- ORDER: Uno tra
ASCENDINGoDESCENDING - DENSITY: Uno tra
SPARSE_ANYoDENSE
Crea un indice di testo
Crea un indice di testo se vuoi eseguire una ricerca di testo per stringhe specifiche all'interno di una raccolta.
Per creare un indice di testo per la tua raccolta, completa i seguenti passaggi:
API MongoDB
Utilizza il
metodo createIndex()
per creare un indice di testo.
Nell'esempio seguente, quando un documento viene scritto nella raccolta cities
con i campi country o food compilati,
questi campi vengono indicizzati a fini di ricerca.
db.cities.createIndex({"country": "text", "food": "text"})
Un campo deve essere una stringa o un array di stringhe da indicizzare.
Gli indici degli array non sono indicizzati per la ricerca. Di conseguenza, l'indicizzazione di a.1.b indicizzerà
something in {a: {1: {b: something}}}, ma non in
{a: [one, {b: something}]}.
Puoi anche creare indici con db.runCommand(). Puoi avere un solo indice di testo per raccolta, ma puoi creare più indici di tipi diversi in un db.runCommand(). L'esempio seguente utilizza db.runCommand()
per creare un indice di testo:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text" },
name: "country_text_food_text"
}
]
})
Specificare una lingua predefinita
Puoi anche specificare facoltativamente una lingua predefinita o un percorso del campo nel documento che conterrà la lingua predefinita.
Nell'esempio seguente, myLanguageField
è specificato come language_override. Quando un documento nella raccolta cities
contiene un campo denominato myLanguageField, il valore di questo campo
viene utilizzato per determinare la lingua per l'indicizzazione del campo country per quel
documento specifico. Questo valore sostituisce la lingua predefinita di french.
db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
- Puoi inserire una lingua come nome completo (
english) o come codice lingua ISO di due lettere (en). - Se la lingua predefinita non viene impostata, Cloud Firestore viene impostato per impostazione predefinita l'inglese.
- Il campo di override della lingua deve essere un campo di primo livello. Se non viene impostato, il
campo di override della lingua è impostato su
languageper impostazione predefinita. - Se imposti la lingua predefinita sul carattere
null, Cloud Firestore non utilizza alcun campo come override della lingua.
Espandi per visualizzare un elenco delle lingue supportate
| Codice lingua | Nome della lingua |
|---|---|
| "und" | Rilevamento automatico |
| "af" | Afrikaans |
| "ak" | Akan |
| "sq" | Albanese |
| "am" | Amarico |
| "ar" | Arabo |
| "hy" | Armeno |
| "az" | Azero |
| "eu" | Basco |
| "be" | Bielorusso |
| "bn" | Bengalese |
| "bs" | Bosniaco |
| "bg" | Bulgaro |
| "my" | Birmano |
| "ca" | Catalano |
| "ceb" | Cebuano |
| "chr" | Cherokee |
| "zh" | Cinese |
| "zh-Hant" | Cinese_tradizionale |
| "hr" | Croato |
| "cs" | Ceco |
| "da" | Danese |
| "nl" | Olandese |
| "en" | Inglese |
| "eo" | Esperanto |
| "et" | Estone |
| "fil" | Filippino |
| "fi" | Finlandese |
| "fr" | Francese |
| "gl" | Galiziano |
| "ka" | Georgiano |
| "de" | Tedesco |
| "el" | Greco |
| "gu" | Gujarati |
| "ht" | Haitian_Creole |
| "ha" | Hausa |
| "haw" | Hawaiano |
| "iw" | Ebraico |
| "hi" | Hindi |
| "hmn" | Hmong |
| "hu" | Ungherese |
| "is" | Islandese |
| "ig" | Igbo |
| "id" | Indonesiano |
| "ga" | Irlandese |
| "it" | Italiano |
| "ja" | Giapponese |
| "jv" | Giavanese |
| "kn" | Kannada |
| "kk" | Kazako |
| "km" | Khmer |
| "ko" | Coreano |
| "lo" | Lao |
| "la" | Latino |
| "lv" | Lettone |
| "lt" | Lituano |
| "lb" | Lussemburghese |
| "mk" | Macedone |
| "mg" | Malgascio |
| "ms" | Malese |
| "ml" | Malayalam |
| "mt" | Maltese |
| "mi" | Maori |
| "mr" | Marathi |
| "mfe" | creolo mauriziano |
| "mn" | Mongolo |
| "sr-ME" | Serbian_Montenegro |
| "ne" | Nepalese |
| "no" | Norvegese |
| "ny" | Nyanja |
| "o" | Odia |
| "fa" | Persiano |
| "pl" | Polacco |
| "pt-BR" | Portuguese_Brazil |
| "pt-PT" | Portuguese_Portugal |
| "pa" | Punjabi |
| "ro" | Rumeno |
| "ru" | Russo |
| "gd" | Gaelico scozzese |
| "sr" | Serbo |
| "st" | Sotho del sud |
| "si" | Singalese |
| "sk" | Slovacco |
| "sl" | Sloveno |
| "so" | Somalo |
| "es" | Spagnolo |
| "su" | Sundanese |
| "sw" | Swahili |
| "sv" | Swedish |
| "tg" | Tagico |
| "ta" | Tamil |
| "te" | Telugu |
| "th" | Thailandese |
| "tr" | Turco |
| "uk" | Ucraino |
| "ur" | Urdu |
| "uz" | Uzbeco |
| "vi" | Vietnamita |
| "cy" | Gallese |
| "yi" | Yiddish |
| "yo" | Yoruba |
| "zu" | Zulu |
Partizionare un indice di testo
Puoi anche partizionare l'indice utilizzando un campo in modo da poter filtrare le query in base a un valore di campo specifico. Questa configurazione ti consente di eseguire query più efficienti se hai sempre bisogno di un campo specifico filtrato nell'indice su cui stai eseguendo la query.
Per creare un indice con una partizione,
configura il campo firestoreOptions nel seguente modo:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text"},
name: "country_text_food_text"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Dove:
PARTITIONED_FIELDè il nome del campo utilizzato per la partizione. Questo valore deve essere una stringa e deve fare riferimento a un campo di primo livello. Quando esegui una query su un indice partizionato, puoi filtrare i risultati in base a un valore di questo campo. Ad esempio, puoi partizionare l'indice utilizzandocity. Se nel tuo indice di testo è definito un campocity, gli utenti possono eseguire query su una città specifica.La partizione deve essere un solo campo. Se partizioni un indice, puoi eseguire solo query in cui viene specificato il campo partizionato.
Limitazioni
- Puoi creare un solo indice per richiesta.
- Gli audit log per la creazione di indici con l'API MongoDB utilizzano il nome del metodo
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Per le opzioni di indice supportate, vedi Indici e proprietà dell'indice.
Firebase console
Nella console Firebase, vai alla pagina Firestore Database.
Seleziona un database dall'elenco.
Nella scheda Indici, fai clic su Crea indice.
Inserisci un ID raccolta.
Aggiungi uno o più percorsi dei campi e seleziona un'opzione di indice per ciascuno.
Fai clic su Crea.
Il nuovo indice viene visualizzato nell'elenco degli indici e le operazioni compatibili con MongoDB iniziano a creare l'indice. Una volta creato l'indice, vedrai un segno di spunta verde accanto. Se l'indice non è stato creato, consulta la sezione Errori di creazione dell'indice per possibili cause.
Crea un indice 2dsphere
Crea un indice 2dsphere per eseguire query geospaziali e cercare documenti che si trovano entro un determinato intervallo da una longitudine e latitudine specifiche.
Per creare un indice 2dsphere per la tua raccolta, completa i seguenti passaggi:
API MongoDB
Utilizza il
metodo createIndex()
per creare un indice. Ad esempio:
db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})
È supportata anche la creazione di indici con db.runCommand() con al massimo un
indice:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
}
]
})
Partizionare un indice 2dsphere
Puoi anche partizionare l'indice utilizzando un campo in modo da poter filtrare le query in base a un valore di campo specifico. Questa configurazione ti consente di eseguire query più efficienti se hai sempre bisogno di un campo specifico filtrato nell'indice su cui stai eseguendo la query.
Per creare un indice con una partizione,
configura il campo firestoreOptions nel seguente modo:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Dove:
PARTITIONED_FIELDè il nome del campo utilizzato per la partizione. Quando esegui una query su un indice partizionato, puoi filtrare i risultati in base a un valore di questo campo. Ad esempio, se il tuo indice ha un camporegionper le sedi regionali, puoi partizionare l'indice utilizzandoregionin modo che gli utenti possano eseguire query sui ristoranti nella loro regione.Se partizioni un indice, puoi eseguire solo query in cui viene specificato il campo partizionato.
Limitazioni
- Puoi creare un solo indice per richiesta.
- Gli audit log per la creazione di indici con l'API MongoDB utilizzano il nome del metodo
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Per le opzioni di indice supportate, vedi Indici e proprietà dell'indice.
Firebase console
Nella console Firebase, vai alla pagina Firestore Database.
Seleziona un database dall'elenco.
Nella scheda Indici, fai clic su Crea indice.
Inserisci un ID raccolta.
Aggiungi uno o più percorsi dei campi e seleziona un'opzione di indice per ciascuno.
Fai clic su Crea.
Il nuovo indice viene visualizzato nell'elenco degli indici e le operazioni compatibili con MongoDB iniziano a creare l'indice. Una volta creato l'indice, vedrai un segno di spunta verde accanto. Se l'indice non è stato creato, consulta la sezione Errori di creazione dell'indice per possibili cause.
Eliminare un indice
Per eliminare un indice, completa i seguenti passaggi:
API MongoDB
Utilizza il metodo dropIndex() per eliminare un indice. Ad esempio:
Eliminare un indice utilizzando il nome dell'indice
db.restaurants.dropIndex("cuisine_index")
Eliminare un indice utilizzando la definizione dell'indice
db.restaurants.dropIndex({"cuisine" : 1})
Firebase console
-
Nella console Firebase, vai alla pagina Database Firestore.
- Seleziona un database dall'elenco.
- Fai clic sulla scheda Indici.
- Nell'elenco degli indici, scegli Elimina dal pulsante Altro per l'indice che vuoi eliminare.
- Fai clic su Elimina indice.
gcloud CLI
Per trovare il nome dell'indice, utilizza il comando
gcloud firestore indexes composite list.gcloud firestore indexes composite list \ --database='DATABASE_ID'
Sostituisci DATABASE_ID con l'ID database.
-
Per eliminare l'indice, utilizza il comando
gcloud firestore indexes composite delete.gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
Sostituisci quanto segue:
- INDEX_NAME: il nome di un indice
- DATABASE_ID: un ID database
Tempo di creazione dell'indice
Per creare un indice, Cloud Firestore deve creare l'indice e poi riempire le voci dell'indice con i dati esistenti. Il tempo necessario per creare un indice è determinato da quanto segue:
Il tempo di compilazione minimo per un indice è di alcuni minuti, anche per un database vuoto.
Il tempo necessario per eseguire il backfill delle voci di indice dipende dalla quantità di dati esistenti che appartengono al nuovo indice. Più valori di campo corrispondono alla definizione dell'indice, più tempo è necessario per eseguire il backfill delle voci dell'indice.
Gestione delle operazioni a lunga esecuzione
Le build dell'indice sono operazioni a lunga esecuzione. Le sezioni seguenti descrivono come utilizzare le operazioni di lunga durata per gli indici.
Dopo aver iniziato a creare un indice, Cloud Firestore assegna
all'operazione un nome univoco. I nomi delle operazioni hanno il prefisso projects/PROJECT_ID/databases/DATABASE_ID/operations/,
ad esempio:
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
Puoi omettere il prefisso quando specifichi un nome di operazione per
il comando describe.
Elenca tutte le operazioni a lunga esecuzione
Per elencare le operazioni a lunga esecuzione, utilizza il comando
gcloud firestore operations list. Questo comando elenca le operazioni in corso e quelle completate di recente.
Le operazioni vengono elencate per alcuni giorni dopo il completamento:
gcloud firestore operations list
Controlla lo stato dell'operazione
Anziché elencare tutte le operazioni a lunga esecuzione, puoi elencare i dettagli di una singola operazione:
gcloud firestore operations describe operation-name
Stima del tempo di completamento
Mentre l'operazione è in esecuzione, visualizza il valore del campo state
per lo stato complessivo dell'operazione.
Una richiesta dello stato di un'operazione a lunga esecuzione restituisce anche le metriche
workEstimated e workCompleted. workEstimated mostra il numero totale stimato
di documenti che un'operazione elaborerà. workCompleted
mostra il numero di documenti elaborati finora. Al termine dell'operazione,
workCompleted riflette il numero totale di documenti effettivamente elaborati, che potrebbe essere diverso dal valore di workEstimated.
Per stimare l'avanzamento di un'operazione, dividi workCompleted per workEstimated.
Di seguito è riportato un esempio dell'avanzamento della creazione di un indice:
{
"operations": [
{
"name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
"metadata": {
"@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
"common": {
"operationType": "CREATE_INDEX",
"startTime": "2020-06-23T16:52:25.697539Z",
"state": "PROCESSING"
},
"progressDocuments": {
"workCompleted": "219327",
"workEstimated": "2198182"
}
},
},
...
Al termine di un'operazione, la descrizione dell'operazione conterrà
"done": true. Visualizza il valore del campo state per
il risultato dell'operazione. Se il campo done non è impostato nella risposta,
l'operazione non è stata completata.