MongoDB Indexación Avanzada

Considere la siguiente colección de documentos (`users`):

{
   "address": {
      "city": "Los Angeles",
      "state": "California",
      "pincode": "123"
   },
   "tags": [
      "music",
      "cricket",
      "blogs"
   ],
   "name": "Tom Benzamin"
}

El documento anterior incluye un subdocumento `address` y un array `tags`.


Indexación de campos de array

Supongamos que recuperamos usuarios según las etiquetas; para ello, necesitamos crear un índice sobre el array `tags` de la colección.

Crear un índice en un array requiere indexar cada campo del array por separado. Por lo tanto, al crear un índice para el array `tags`, se crean índices individuales para los tres valores: `music`, `cricket` y `blogs`.

Use el siguiente comando para crear el índice de array:

>db.users.ensureIndex({"tags":1})

Después de crear el índice, podemos consultar el campo `tags` de la colección de esta manera:

>db.users.find({tags:"cricket"})

Para verificar que hemos utilizado el índice, podemos usar el comando `explain`:

>db.users.find({tags:"cricket"}).explain()

En el resultado de ejecutar el comando anterior se mostrará `"cursor" : "BtreeCursor tags_1"`, lo que indica que se ha utilizado el índice.


Indexación de campos de subdocumentos

Supongamos que necesitamos recuperar documentos por los campos `city`, `state` y `pincode`. Como estos campos son del subdocumento, necesitamos crear un índice sobre el subdocumento.

El comando para crear un índice sobre los tres campos del subdocumento es el siguiente:

>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})

Una vez creado el índice, podemos usar los campos del subdocumento para recuperar datos:

>db.users.find({"address.city":"Los Angeles"})   

La expresión de consulta no tiene que seguir el orden del índice especificado; MongoDB la optimizará automáticamente. Por lo tanto, el índice creado anteriormente admitirá las siguientes consultas:

>db.users.find({"address.state":"California","address.city":"Los Angeles"}) 

También admite las siguientes consultas:

>db.users.find({"address.city":"Los Angeles","address.state":"California","address.pincode":"123"})
Otras extensiones