Administra índices
En esta página, se describe cómo administrar tus índices. Para obtener más información sobre los índices, consulta Descripción general de los índices.
Antes de comenzar
Antes de crear un índice en Firestore con compatibilidad con MongoDB, asegúrate de tener asignado alguno de los siguientes roles:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
Para otorgar un rol, consulta Otorga un solo rol. Para obtener más información sobre los roles de Firestore y los permisos asociados, consulta Roles predefinidos.
Si definiste roles personalizados, asigna todos los permisos siguientes para crear índices:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
Crear un índice
Para crear un índice, completa los siguientes pasos:
API de MongoDB
Usa el método createIndex() para crear un índice. Por ejemplo:
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
La creación de índices con
db.runCommand()también se admite con un máximo de un índice.db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
Ten en cuenta las siguientes limitaciones:
- Solo puedes crear un índice por solicitud.
db.collection.createIndexes()no es compatible. - Los registros de auditoría para la creación de índices con la API de MongoDB usan el nombre del método
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Para conocer las opciones de índice compatibles, consulta Índices y propiedades de los índices.
Consola deGoogle Cloud
-
En la consola de Google Cloud , ve a la página Bases de datos.
- Selecciona una base de datos de la lista.
- En el menú de navegación, haz clic en Índices.
- Haz clic en Crear índice.
- Ingresa un ID de colección.
- Agrega una o más rutas de campo y selecciona una opción de índice para cada una.
- Selecciona una opción de presencia de campo, ya sea no dispersa o dispersa.
- De manera opcional, puedes establecer las opciones índice de varias claves o índice único.
- Haz clic en Crear.
- Tu índice nuevo se muestra en la lista de índices y Firestore con compatibilidad con MongoDB comienza a crear tu índice. Cuando se cree el índice, verás una marca de verificación verde junto a él. Si no se crea el índice, consulta Errores en la compilación de índices para conocer las posibles causas.
gcloud CLI
Para crear un índice, usa el comando gcloud firestore indexes composite create. Establece api-scope en 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
Reemplaza lo siguiente:
- DATABASE_ID: Un ID de base de datos.
- COLLECTION: Es el nombre de una colección.
- FIELD_CONFIGURATION: Es una configuración de campo. Para cada campo, agrega
--field-config=field-path=. Por ejemplo:--field-config=field-path=user-id,order=descending \ --field-config=field-path=score,order=descendingPara obtener más información sobre cómo configurar estos campos, consulta
--field-config.
Para crear un índice disperso, establece --density=sparse-any.
Para crear un índice de varias claves, agrega la marca --multikey.
Para crear un índice único, agrega la marca --unique.
Terraform
Usa el recurso google_firestore_index y establece api_scope en MONGODB_COMPATIBLE_API y query_scope en 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" }
Reemplaza lo siguiente:
- DATABASE_ID: Es el ID de la base de datos que elegiste
- COLLECTION: Es el nombre de la colección que se indexará
- FIELD_PATH: Es el nombre del campo que se indexará
- ORDER: Puede ser
ASCENDINGoDESCENDING - DENSITY: Puede ser
SPARSE_ANYoDENSE
Crea un índice de texto
Crea un índice de texto si deseas realizar una búsqueda de texto para encontrar cadenas específicas dentro de una colección.
Para crear un índice de texto para tu colección, completa los siguientes pasos:
API de MongoDB
Usa el método createIndex() para crear un índice de texto.
En el siguiente ejemplo, cuando se escribe un documento en la colección cities con los campos country o food completados, estos campos se indexan para fines de búsqueda.
db.cities.createIndex({"country": "text", "food": "text"})
Un campo debe ser una cadena o un array de cadenas para indexarse.
Los índices de array no se indexan para la búsqueda. Como resultado, la indexación de a.1.b indexará something en {a: {1: {b: something}}}, pero no en {a: [one, {b: something}]}.
También puedes crear índices con db.runCommand(). Solo puedes tener un índice de texto por colección, pero puedes crear varios índices de diferentes tipos en un db.runCommand(). En el siguiente ejemplo, se usa db.runCommand() para crear un índice de texto:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text" },
name: "country_text_food_text"
}
]
})
Cómo especificar un idioma predeterminado
También puedes especificar de forma opcional un idioma predeterminado o una ruta de acceso de campo en tu documento que contendrá el idioma predeterminado.
En el siguiente ejemplo, myLanguageField se especifica como language_override. Cuando un documento de la colección cities contiene un campo llamado myLanguageField, el valor de ese campo se usa para determinar el idioma para indexar el campo country de ese documento específico. Ese valor anula el idioma predeterminado de french.
db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
- Puedes ingresar un idioma con su nombre completo (
english) o con su código de idioma ISO de dos letras (en). - Si no se configura el idioma predeterminado, Firestore usará el inglés de forma predeterminada.
- El campo de anulación del idioma debe ser un campo de nivel superior. Si no se configura, el campo de anulación de idioma se establece de forma predeterminada en
language. - Si configuras el idioma predeterminado en el carácter
null, Firestore con compatibilidad con MongoDB no usará ningún campo como anulación de idioma.
Expande para ver una lista de los idiomas compatibles
| Código de idioma | Idioma |
|---|---|
| "und" | Detección automática |
| "af" | Afrikaans |
| "ak" | Akan |
| "sq" | Albanés |
| "am" | Amárico |
| "ar" | Árabe |
| "hy" | Armenio |
| "az" | Azerí |
| "eu" | Euskara |
| "ser" | Bielorruso |
| "bn" | Bengalí |
| "bs" | Bosnio |
| "bg" | Búlgaro |
| "mi" | Birmano |
| "ca" | Catalán |
| "ceb" | Cebuano |
| "chr" | Cheroqui |
| "zh" | Chino |
| "zh-Hant" | Chino (tradicional) |
| "hr" | Croata |
| "cs" | Checo |
| "da" | Danés |
| "nl" | Holandés |
| "en" | Inglés |
| "eo" | Esperanto |
| "et" | Estonio |
| "fil" | Filipino |
| "fi" | Finlandés |
| "fr" | Francés |
| "gl" | Gallego |
| "ka" | Georgiano |
| "de" | Alemán |
| "el" | Griego |
| "gu" | Guyaratí |
| "ht" | Haitian_Creole |
| "ha" | Hausa |
| "haw" | Hawaiano |
| "iw" | Hebreo |
| "hola" | Hindi |
| "hmn" | Hmong |
| "hu" | Húngaro |
| "es" | Islandés |
| "ig" | Igbo |
| "id" | Indonesio |
| "ga" | Irlandés |
| "it" | Italiano |
| "ja" | Japonés |
| "jv" | Javanés |
| "kn" | Canarés |
| "kk" | Kazajo |
| "km" | Jemer |
| "ko" | Coreano |
| "lo" | Laosiano |
| "la" | Latín |
| "lv" | Letón |
| "lt" | Lituano |
| "lb" | Luxemburgués |
| "mk" | Macedonio |
| "mg" | Malgache |
| "ms" | Malayo |
| "ml" | Malayalam |
| "mt" | Maltés |
| "mi" | Maorí |
| "mr" | Maratí |
| "mfe" | criollo mauriciano |
| "mn" | Mongol |
| "sr-ME" | Serbian_Montenegro |
| "ne" | Nepalí |
| "no" | Noruego |
| "ny" | Nyanja |
| "o" | Oriya |
| "fa" | Persa |
| "pl" | Polaco |
| "pt-BR" | Portugués (Brasil) |
| "pt-PT" | Portugués (Portugal) |
| "pa" | Punyabí |
| "ro" | Rumano |
| "ru" | Ruso |
| "gd" | Gaélico escocés |
| "sr" | Serbio |
| "st" | Sesoto meridional |
| "si" | Cingalés |
| "sk" | Eslovaco |
| "sl" | Esloveno |
| "así que" | Somalí |
| "es" | Español |
| "su" | Sundanés |
| "sw" | Suajili |
| "sv" | Sueco |
| "tg" | Tayiko |
| "ta" | Tamil |
| "te" | Telugu |
| "th" | Tailandés |
| "tr" | Turco |
| "uk" | Ucraniano |
| "ur" | Urdu |
| "uz" | Uzbeko |
| "vi" | Vietnamita |
| "cy" | Galés |
| "yi" | Yiddish |
| "yo" | Yoruba |
| "zu" | Zulú |
Cómo particionar un índice de texto
También puedes particionar tu índice con un campo para filtrar las búsquedas por un valor de campo específico. Esta configuración te permite ejecutar consultas más eficientes si siempre necesitas filtrar un campo específico en el índice que consultas.
Para crear un índice con una partición, configura el campo firestoreOptions de la siguiente manera:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text"},
name: "country_text_food_text"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Aquí:
PARTITIONED_FIELDes el nombre del campo que se usa para la partición. Este valor debe ser una cadena y debe hacer referencia a un campo de nivel superior. Cuando ejecutas una consulta en un índice particionado, puedes filtrar los resultados según un valor de este campo. Por ejemplo, podrías particionar tu índice concity. Si se define un campocityen tu índice de texto, los usuarios pueden realizar búsquedas en una ciudad específica.La partición debe ser solo un campo. Si particionas un índice, solo podrás ejecutar consultas en las que se especifique el campo particionado.
Limitaciones
- Solo puedes crear un índice por solicitud.
- Los registros de auditoría para la creación de índices con la API de MongoDB usan el nombre del método
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Para conocer las opciones de índice compatibles, consulta Índices y propiedades de los índices.
Consola de Google Cloud
En la Google Cloud consola, ve a la página Bases de datos.
Selecciona una base de datos de la lista.
En el menú de navegación, haz clic en Índices.
Haz clic en Crear índice y, luego, en Crear índice de búsqueda.
Ingresa un nombre para el índice (opcional).
Ve a Tipo de búsqueda y selecciona Texto.
Ingresa un ID de colección.
Ingresa al menos una ruta de acceso al campo.
Opcional: Especifica un idioma predeterminado.
Por ejemplo, estableces la ruta de anulación de idioma en
myLanguageField. Cuando un documento de tu colección contiene un campo llamadomyLanguageField, el valor de ese campo se usa para determinar el idioma para indexar los campos definidos en tu índice. Ese valor anula el idioma predeterminado de tu índice.Haz clic en Crear.
Tu índice nuevo se muestra en la lista de índices y las operaciones compatibles con MongoDB comienzan a crear tu índice. Cuando se cree el índice, verás una marca de verificación verde junto a él. Si no se crea el índice, consulta Errores en la compilación de índices para conocer las posibles causas.
Crea un índice 2dsphere
Crea un índice 2dsphere para realizar consultas geoespaciales y buscar documentos que existan dentro de un rango determinado a partir de una longitud y latitud específicas.
Para crear un índice 2dsphere para tu colección, completa los siguientes pasos:
API de MongoDB
Usa el método createIndex() para crear un índice. Por ejemplo:
db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})
La creación de índices con db.runCommand() también se admite con un máximo de un índice:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
}
]
})
Cómo particionar un índice 2dsphere
También puedes particionar tu índice con un campo para filtrar las búsquedas por un valor de campo específico. Esta configuración te permite ejecutar consultas más eficientes si siempre necesitas filtrar un campo específico en el índice que consultas.
Para crear un índice con una partición, configura el campo firestoreOptions de la siguiente manera:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
Aquí:
PARTITIONED_FIELDes el nombre del campo que se usa para la partición. Cuando ejecutas una consulta en un índice particionado, puedes filtrar los resultados según un valor de este campo. Por ejemplo, si tu índice tiene un camporegionpara ubicaciones regionales, puedes particionarlo conregionpara que los usuarios puedan realizar consultas sobre restaurantes en su región.Si particionas un índice, solo podrás ejecutar consultas en las que se especifique el campo particionado.
Limitaciones
- Solo puedes crear un índice por solicitud.
- Los registros de auditoría para la creación de índices con la API de MongoDB usan el nombre del método
google.firestore.admin.v1.FirestoreAdmin.CreateIndex. - Para conocer las opciones de índice compatibles, consulta Índices y propiedades de los índices.
Consola de Google Cloud
En la Google Cloud consola, ve a la página Bases de datos.
Selecciona una base de datos de la lista.
En el menú de navegación, haz clic en Índices.
Haz clic en Crear índice y, luego, en Crear índice de búsqueda.
Ingresa un ID de colección.
Ve a Tipo de búsqueda y selecciona Geo (2dsphere).
Haz clic en Crear.
Tu índice nuevo se muestra en la lista de índices y las operaciones compatibles con MongoDB comienzan a crear tu índice. Cuando se cree el índice, verás una marca de verificación verde junto a él. Si no se crea el índice, consulta Errores en la compilación de índices para conocer las posibles causas.
Borra un índice
Para borrar un índice, completa los siguientes pasos:
API de MongoDB
Usa el método dropIndex() para borrar un índice. Por ejemplo:
Borra un índice con su nombre
db.restaurants.dropIndex("cuisine_index")
Cómo borrar un índice con la definición del índice
db.restaurants.dropIndex({"cuisine" : 1})
Consola deGoogle Cloud
-
En la consola de Google Cloud , ve a la página Bases de datos.
- En la lista de bases de datos, selecciona una.
- En el menú de navegación, haz clic en Índices.
- En la lista de índices, elige Borrar en el botón Más del índice que deseas borrar.
- Haz clic en Borrar índice.
gcloud CLI
Para encontrar el nombre del índice, usa el comando
gcloud firestore indexes composite list.gcloud firestore indexes composite list \ --database='DATABASE_ID'
Reemplaza DATABASE_ID por el ID de la base de datos.
-
Para borrar el índice, usa el comando
gcloud firestore indexes composite delete.gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
Reemplaza lo siguiente:
- INDEX_NAME: Es el nombre de un índice
- DATABASE_ID: Es un ID de base de datos
Tiempo de compilación de índices
Para compilar un índice, Firestore con compatibilidad con MongoDB debe crear el índice y, luego, reabastecer las entradas del índice con los datos existentes. El tiempo necesario para crear un índice se determina según lo siguiente:
El tiempo de compilación mínimo de un índice es de unos minutos, incluso para una base de datos vacía.
El tiempo necesario para reabastecer las entradas de índice depende de la cantidad de datos existentes que pertenecen al índice nuevo. Cuantos más valores de campo coincidan con la definición del índice, más tiempo tardará el reabastecimiento.
Administra operaciones de larga duración
Las compilaciones de índices son operaciones de larga duración. En las siguientes secciones, se describe cómo trabajar con operaciones de larga duración para los índices.
Después de que comienzas a crear un índice, Firestore con compatibilidad con MongoDB le asigna un nombre único a la operación. Los nombres de las operaciones incluyen el prefijo projects/PROJECT_ID/databases/DATABASE_ID/operations/. Por ejemplo:
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
Puedes omitir el prefijo cuando especifiques el nombre de una operación para el comando describe.
Enumera todas las operaciones de larga duración
Para enumerar las operaciones de larga duración, usa el comando gcloud firestore operations list. Este comando enumera las operaciones en curso y las que se completaron recientemente.
Las operaciones se enumeran durante algunos días luego de completarse:
gcloud firestore operations list
Verifica el estado de la operación
En lugar de enumerar todas las operaciones de larga duración, puedes enumerar los detalles de una sola operación:
gcloud firestore operations describe operation-name
Estima la hora de finalización
A medida que se ejecuta tu operación, mira el valor del campo state para conocer el estado general.
Una solicitud del estado de una operación de larga duración también muestra las métricas workEstimated y workCompleted. workEstimated muestra la cantidad total estimada de documentos que
procesará una operación. workCompleted muestra la cantidad de documentos procesados hasta el momento. Una vez que se completa la operación, workCompleted refleja la cantidad total de documentos que se procesaron, que podría ser diferente del valor de workEstimated.
Para estimar el progreso de una operación, divide workCompleted entre workEstimated.
A continuación, se muestra un ejemplo del progreso de la creación de un índice:
{
"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"
}
},
},
...
Cuando se completa una operación, su descripción contendrá "done": true. Consulta el valor del campo state para ver el resultado de la operación. Si el campo done no está establecido en la respuesta, significa que la operación no se completó.