Cette page explique comment gérer vos index. Pour en savoir plus sur les index, consultez la présentation des index.
Avant de commencer
Avant de pouvoir créer un index dans Cloud Firestore, assurez-vous que l'un des rôles suivants vous est attribué :
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Pour attribuer un rôle, consultez la section Attribuer un rôle unique. Pour en savoir plus sur les rôles Cloud Firestore et les autorisations associées, consultez la section 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 createIndex() méthode 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 compatible 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 la section Index et propriétés d'index.
Firebase console
-
Dans la console Firebase, accédez à la page Firestore Database (Base de données Firestore).
- Sélectionnez une base de données dans la liste.
- Dans l'onglet Indexes (Index), cliquez sur Create Index (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 également définir l'option d'index multiclés.
- Cliquez sur Create (Créer).
- Votre nouvel index s'affiche dans la liste des index et Cloud Firestore commence à le créer. Une fois l'index créé, une coche verte s'affiche à côté de celui-ci. Si l'index n'est pas créé, consultez la section Erreurs de création d'index pour connaître les causes possibles.
gcloud CLI
Pour créer un index, utilisez la
gcloud firestore indexes composite create
commande. 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 de 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 la section
--field-config.
Pour créer un index éparse, définissez --density=sparse-any.
Pour créer un index multiclés, ajoutez l'indicateur --multikey.
Pour créer un index unique, ajoutez l'indicateur --unique.
Terraform
Utilisez la
google_firestore_index
ressource et 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 base de données pour la base de données choisie.
- COLLECTION : nom de la collection à indexer.
- FIELD_PATH : nom du champ à indexer.
- ORDER :
ASCENDINGouDESCENDING. - DENSITY :
SPARSE_ANYouDENSE.
Supprimer un index
Pour supprimer un index, procédez comme suit :
API MongoDB
Utilisez la dropIndex() méthode pour supprimer un index. Exemple :
Supprimer un index à l'aide du nom de l'index
db.restaurants.dropIndex("cuisine_index")
Supprimer un index à l'aide de la définition de l'index
db.restaurants.dropIndex({"cuisine" : 1})
Firebase console
-
Dans la console Firebase, accédez à la page Firestore Database (Base de données Firestore).
- Sélectionnez une base de données dans la liste.
- Cliquez sur l'onglet Indexes (Index).
- Dans la liste des index, cliquez sur le bouton More correspondant à l'index que vous souhaitez supprimer , puis sélectionnez Delete.
- Cliquez sur Delete Index (Supprimer l'index).
gcloud CLI
Pour trouver le nom de l'index, utilisez la
gcloud firestore indexes composite listcommande.gcloud firestore indexes composite list \ --database='DATABASE_ID'
Remplacez DATABASE_ID par l'ID de base de données.
-
Pour supprimer l'index, utilisez la
gcloud firestore indexes composite deletecommande.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 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 à la création d'un index est déterminé par les éléments suivants :
Le temps de création minimal 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 lancé la création d'un index, Cloud Firestore attribue
à l'opération un nom unique. 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.
Répertorier toutes les opérations de longue durée
Pour répertorier les opérations de longue durée, exécutez la
gcloud firestore operations list
commande. 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 également les métriques workEstimated et workCompleted. workEstimated indique le nombre total estimé de documents qu'une opération traitera. 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"
}
},
},
...
Une fois l'opération terminée, 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, cela signifie que l'opération n'est pas terminée.