Cette page explique comment gérer vos index. Pour en savoir plus sur les index, consultez Présentation des index.
Avant de commencer
Avant de pouvoir créer un index dans Cloud Firestore, assurez-vous de disposer de l'un des rôles suivants :
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Pour attribuer un rôle, consultez Attribuer un rôle unique. Pour en savoir plus sur les rôles Cloud Firestore et les autorisations associées, consultez Rôles prédéfinis.
Si vous avez défini des rôles personnalisés, attribuez toutes les autorisations suivantes pour créer des index :
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
Créer un index
Pour créer un index, procédez comme suit :
API MongoDB
Utilisez la méthode createIndex() pour créer un index. Exemple :
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
La création d'index avec
db.runCommand()est également acceptée avec un index au maximum.db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
Prenez note des restrictions suivantes :
- Vous ne pouvez créer qu'un seul index par requête.
db.collection.createIndexes()n'est pas compatible. - Les journaux d'audit pour la création d'index avec l'API MongoDB utilisent le nom de méthode
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Pour connaître les options d'index compatibles, consultez Index et propriétés d'index.
Console Firebase
-
Dans la console Firebase, accédez à la page Base de données Firestore.
- Sélectionnez une base de données dans la liste.
- Dans l'onglet Index, cliquez sur Créer un index.
- Saisissez un ID de collection.
- Ajoutez un ou plusieurs chemins de champ, puis sélectionnez une option d'index pour chacun d'eux.
- Sélectionnez une option de présence de champ, non éparse ou éparse.
- Vous pouvez éventuellement définir l'option Index multiclés.
- Cliquez sur Créer.
- Votre nouvel index s'affiche dans la liste des index et Cloud Firestore commence à le créer. Une fois votre index créé, une coche verte apparaît à côté de l'index. Si l'index n'est pas créé, consultez Erreurs de création d'index pour connaître les causes possibles.
gcloud CLI
Pour créer un index, utilisez la commande gcloud firestore indexes composite create. Définissez api-scope sur 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
Remplacez les éléments suivants :
- DATABASE_ID : ID de base de données.
- COLLECTION : nom d'une collection.
- FIELD_CONFIGURATION : configuration de champ. Pour chaque champ, ajoutez
--field-config=field-path=. Exemple :--field-config=field-path=user-id,order=descending \ --field-config=field-path=score,order=descendingPour en savoir plus sur la configuration de ces champs, consultez
--field-config.
Pour créer un index creux, définissez --density=sparse-any.
Pour créer un index multiclés, ajoutez l'option --multikey.
Pour créer un index unique, ajoutez l'indicateur --unique.
Terraform
Utilisez la ressource google_firestore_index, puis définissez api_scope sur MONGODB_COMPATIBLE_API et query_scope sur 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" }
Remplacez les éléments suivants :
- DATABASE_ID : ID de la base de données que vous avez choisie
- COLLECTION : nom de la collection à indexer.
- FIELD_PATH : nom du champ à indexer
- ORDER :
ASCENDINGouDESCENDING - DENSITY :
SPARSE_ANYouDENSE
Créer un index textuel
Créez un index de texte si vous souhaitez effectuer une recherche de texte pour des chaînes spécifiques dans une collection.
Pour créer un index de texte pour votre collection, procédez comme suit :
API MongoDB
Utilisez la méthode createIndex() pour créer un index de texte.
Dans l'exemple suivant, lorsqu'un document est écrit dans la collection cities avec les champs country ou food renseignés, ces champs sont indexés à des fins de recherche.
db.cities.createIndex({"country": "text", "food": "text"})
Pour être indexé, un champ doit être une chaîne ou un tableau de chaînes.
Les index de tableaux ne sont pas indexés pour la recherche. Par conséquent, l'indexation de a.1.b indexera something dans {a: {1: {b: something}}}, mais pas dans {a: [one, {b: something}]}.
Vous pouvez également créer des index avec db.runCommand(). Vous ne pouvez avoir qu'un seul index de texte par collection, mais vous pouvez créer plusieurs index de différents types dans un db.runCommand(). L'exemple suivant utilise db.runCommand() pour créer un index de texte :
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text" },
name: "country_text_food_text"
}
]
})
Spécifier une langue par défaut
Vous pouvez également spécifier une langue par défaut ou un chemin de champ dans votre document qui contiendra la langue par défaut.
Dans l'exemple suivant, myLanguageField est spécifié comme language_override. Lorsqu'un document de la collection cities contient un champ nommé myLanguageField, la valeur de ce champ est utilisée pour déterminer la langue d'indexation du champ country pour ce document spécifique. Cette valeur remplace la langue par défaut de french.
db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
- Vous pouvez saisir une langue sous sa forme longue (
english) ou sous son code de langue ISO à deux lettres (en). - Si la langue par défaut n'est pas définie, Cloud Firestore est défini sur l'anglais par défaut.
- Le champ de remplacement de la langue doit être un champ de niveau supérieur. Si ce champ n'est pas défini, la valeur par défaut est
language. - Si vous définissez la langue par défaut sur le caractère
null, Cloud Firestore n'utilise aucun champ comme remplacement de langue.
Développer pour afficher la liste des langues disponibles
| Code de langue | Nom de la langue |
|---|---|
| "und" | Détection automatique |
| "af" | Afrikaans |
| "ak" | Akan |
| "sq" | Albanais |
| "am" | Amharique |
| "ar" | Arabe |
| "hy" | Arménien |
| "az" | Azéri |
| "eu" | Basque |
| "be" | Biélorusse |
| "bn" | Bengali |
| "bs" | Bosniaque |
| "bg" | Bulgare |
| "my" | Birman |
| "ca" | Catalan |
| "ceb" | Cebuano |
| "chr" | Cherokee |
| "zh" | Chinois |
| "zh-Hant" | Chinois_traditionnel |
| "hr" | Croate |
| "cs" | Tchèque |
| "da" | Danois |
| "nl" | Néerlandais |
| "en" | Anglais |
| "eo" | Espéranto |
| "et" | Estonien |
| "fil" | Filipino |
| "fi" | Finnois |
| "fr" | Français |
| "gl" | Galicien |
| "ka" | Géorgien |
| "de" | Allemand |
| "el" | Grec |
| "gu" | Gujarati |
| "ht" | Haitian_Creole |
| "ha" | Haoussa |
| "haw" | Hawaïen |
| "iw" | Hébreu |
| "salut" | Hindi |
| "hmn" | Hmong |
| "hu" | Hongrois |
| "is" | Islandais |
| "ig" | Igbo |
| "id" | Indonésien |
| "ga" | Irlandais |
| "it" | Italien |
| "ja" | Japonais |
| "jv" | Javanais |
| "kn" | Kannada |
| "kk" | Kazakh |
| "km" | Khmer |
| "ko" | Coréen |
| "lo" | Laotien |
| "la" | Latin |
| "lv" | Letton |
| "lt" | Lituanien |
| "lb" | Luxembourgeois |
| "mk" | Macédonien |
| "mg" | Malgache |
| "ms" | Malais |
| "ml" | Malayalam |
| "mt" | Maltais |
| "mi" | Maori |
| "mr" | Marathi |
| "mfe" | créole mauricien |
| "mn" | Mongol |
| "sr-ME" | Serbian_Montenegro |
| "ne" | Népalais |
| "non" | Norvégien |
| "ny" | Chichewa |
| "ou" | Odia |
| "fa" | Persan |
| "pl" | Polonais |
| "pt-BR" | Portuguese_Brazil |
| "pt-PT" | Portuguese_Portugal |
| "pa" | Panjabi |
| "ro" | Roumain |
| "ru" | Russe |
| "gd" | Gaélique écossais |
| "sr" | Serbe |
| "st" | Sesotho |
| "si" | Cingalais |
| "sk" | Slovaque |
| "sl" | Slovène |
| "so" | Somali |
| "es" | Espagnol |
| "su" | Soundanais |
| "sw" | Swahili |
| "sv" | Suédois |
| "tg" | Tadjik |
| "ta" | Tamoul |
| "te" | Telugu |
| "th" | Thaï |
| "tr" | Turc |
| "uk" | Ukrainien |
| "ur" | Urdu |
| "uz" | Ouzbek |
| "vi" | Vietnamien |
| "cy" | Gallois |
| "yi" | Yiddish |
| "yo" | Yoruba |
| "zu" | Zoulou |
Partitionner un index de texte
Vous pouvez également partitionner votre index à l'aide d'un champ afin de pouvoir filtrer les requêtes par valeur de champ spécifique. Cette configuration vous permet d'exécuter des requêtes plus performantes si vous avez toujours besoin d'un champ spécifique filtré dans l'index que vous interrogez.
Pour créer un index avec une partition, configurez le champ firestoreOptions comme suit :
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text"},
name: "country_text_food_text"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Où :
PARTITIONED_FIELDest le nom du champ utilisé pour la partition. Cette valeur doit être une chaîne et doit faire référence à un champ de premier niveau. Lorsque vous exécutez une requête sur un index partitionné, vous pouvez filtrer les résultats en fonction d'une valeur de ce champ. Par exemple, vous pouvez partitionner votre index à l'aide decity. Si un champcityest défini dans votre index de texte, les utilisateurs peuvent interroger une ville spécifique.La partition ne doit comporter qu'un seul champ. Si vous partitionnez un index, vous ne pouvez exécuter que des requêtes dans lesquelles le champ partitionné est spécifié.
Limites
- Vous ne pouvez créer qu'un seul index par requête.
- Les journaux d'audit pour la création d'index avec l'API MongoDB utilisent le nom de méthode
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Pour connaître les options d'index compatibles, consultez Index et propriétés d'index.
Console Firebase
Dans la consoleFirebase, accédez à la page Base de données Firestore.
Sélectionnez une base de données dans la liste.
Dans l'onglet Index, cliquez sur Créer un index.
Saisissez un ID de collection.
Ajoutez un ou plusieurs chemins de champ, puis sélectionnez une option d'index pour chacun d'eux.
Cliquez sur Créer.
Votre nouvel index apparaît dans la liste des index et les opérations compatibles avec MongoDB commencent à le créer. Une fois que votre index est créé, une coche verte apparaît à côté de l'index. Si l'index n'est pas créé, consultez Erreurs de création d'index pour connaître les causes possibles.
Créer un index 2dsphere
Créez un index 2dsphere pour effectuer des requêtes géospatiales et rechercher des documents qui se trouvent dans une certaine plage à partir d'une longitude et d'une latitude spécifiques.
Pour créer un index 2dsphere pour votre collection, procédez comme suit :
API MongoDB
Utilisez la méthode createIndex() pour créer un index. Exemple :
db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})
La création d'index avec db.runCommand() est également acceptée avec au maximum un index :
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
}
]
})
Partitionner un index 2dsphere
Vous pouvez également partitionner votre index à l'aide d'un champ afin de pouvoir filtrer les requêtes par valeur de champ spécifique. Cette configuration vous permet d'exécuter des requêtes plus performantes si vous avez toujours besoin d'un champ spécifique filtré dans l'index que vous interrogez.
Pour créer un index avec une partition, configurez le champ firestoreOptions comme suit :
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Où :
PARTITIONED_FIELDest le nom du champ utilisé pour la partition. Lorsque vous exécutez une requête sur un index partitionné, vous pouvez filtrer les résultats en fonction d'une valeur de ce champ. Par exemple, si votre index comporte un champregionpour les zones géographiques, vous pouvez partitionner votre index à l'aide deregionafin que les utilisateurs puissent interroger les restaurants de leur région.Si vous partitionnez un index, vous ne pouvez exécuter des requêtes que lorsque le champ partitionné est spécifié.
Limites
- Vous ne pouvez créer qu'un seul index par requête.
- Les journaux d'audit pour la création d'index avec l'API MongoDB utilisent le nom de méthode
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Pour connaître les options d'index compatibles, consultez Index et propriétés d'index.
Console Firebase
Dans la consoleFirebase, accédez à la page Base de données Firestore.
Sélectionnez une base de données dans la liste.
Dans l'onglet Index, cliquez sur Créer un index.
Saisissez un ID de collection.
Ajoutez un ou plusieurs chemins de champ, puis sélectionnez une option d'index pour chacun d'eux.
Cliquez sur Créer.
Votre nouvel index apparaît dans la liste des index et les opérations compatibles avec MongoDB commencent à le créer. Une fois que votre index est créé, une coche verte apparaît à côté de l'index. Si l'index n'est pas créé, consultez Erreurs de création d'index pour connaître les causes possibles.
Supprimer un index
Pour supprimer un index, procédez comme suit :
API MongoDB
Utilisez la méthode dropIndex() pour supprimer un index. Exemple :
Supprimer un index à l'aide de son nom
db.restaurants.dropIndex("cuisine_index")
Supprimer un index à l'aide de la définition d'index
db.restaurants.dropIndex({"cuisine" : 1})
Console Firebase
-
Dans la console Firebase, accédez à la page Base de données Firestore.
- Sélectionnez une base de données dans la liste.
- Cliquez sur l'onglet Index.
- Dans la liste des index, sélectionnez Supprimer dans le bouton Plus de l'index que vous souhaitez supprimer.
- Cliquez sur Supprimer l'index.
gcloud CLI
Pour trouver le nom de l'index, utilisez la commande
gcloud firestore indexes composite list.gcloud firestore indexes composite list \ --database='DATABASE_ID'
Remplacez DATABASE_ID par l'ID de la base de données.
-
Pour supprimer l'index, utilisez la commande
gcloud firestore indexes composite delete.gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
Remplacez les éléments suivants :
- INDEX_NAME : nom d'un index
- DATABASE_ID : ID de la base de données
Temps de création d'un index
Pour créer un index, Cloud Firestore doit créer l'index, puis remplir les entrées d'index avec les données existantes. Le temps nécessaire pour créer un index est déterminé par les éléments suivants :
La durée minimale de compilation d'un index est de quelques minutes, même pour une base de données vide.
Le temps nécessaire pour remplir les entrées d'index dépend de la quantité de données existantes qui appartiennent au nouvel index. Plus les valeurs de champs correspondant à la définition de l'index sont nombreuses, plus le remplissage des entrées d'index prend du temps.
Gérer les opérations de longue durée
Les créations d'index sont des opérations de longue durée. Les sections suivantes décrivent comment utiliser les opérations de longue durée pour les index.
Une fois que vous avez commencé à créer un index, Cloud Firestore attribue un nom unique à l'opération. Les noms des opérations sont précédés du préfixe projects/PROJECT_ID/databases/DATABASE_ID/operations/, par exemple :
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
Vous pouvez omettre le préfixe lorsque vous spécifiez un nom d'opération pour la commande describe.
Lister toutes les opérations de longue durée
Pour répertorier les opérations de longue durée, utilisez la commande gcloud firestore operations list. Cette commande répertorie les opérations en cours et récemment terminées.
Une fois terminées, les opérations restent accessibles pendant quelques jours :
gcloud firestore operations list
Vérifier l'état de l'opération
Au lieu de répertorier toutes les opérations de longue durée, vous pouvez répertorier les détails d'une seule opération :
gcloud firestore operations describe operation-name
Estimation du délai d'exécution
Lorsque l'opération s'exécute, consultez la valeur du champ state pour connaître son état global.
Une requête permettant d'obtenir l'état d'une opération de longue durée renvoie les métriques workEstimated et workCompleted. workEstimated indique le nombre total estimé de documents qu'une opération va traiter. workCompleted indique le nombre de documents traités jusqu'à présent. Une fois l'opération terminée, workCompleted reflète le nombre total de documents réellement traités, qui peut être différent de la valeur de workEstimated.
Pour estimer la progression d'une opération, divisez workCompleted par workEstimated.
Voici un exemple de progression de la création d'un index :
{
"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"
}
},
},
...
Lorsqu'une opération se termine, la description de l'opération contient "done": true. Consultez la valeur du champ state pour afficher le résultat de l'opération. Si le champ done n'est pas défini dans la réponse, l'opération n'est pas terminée.