23 - Indices - con campos de tipo documento y array

MongoDB permite acceder a sus documentos y crear índices en campos de tipo documento. Los campos de tipo documento se pueden combinar con campos de nivel superior en índices compuestos y, aunque tienen algunas particularidades en algunos aspectos, se comportan principalmente como se comportan los campos de índice "normales".

Podemos crear un índice simple de un subcampo, como por ejemplo la 'calle' del campo 'direccion':

use base1
db.clientes.drop()

db.clientes.insertOne(
  {
    _id: 1,  
    nombre: 'Martinez Victor',
    mail: 'mvictor@gmail.com',
    direccion: {
      calle: 'Colon',
      numero: 620,
      codigopostal: 5000
    }
  }
)
db.clientes.insertOne(
  {
    _id: 2,  
    nombre: 'Alonso Carlos',
    mail: 'acarlos@gmail.com',
    direccion: {
      calle: 'Colon',
      numero: 150,
      codigopostal: 5000
    }
  }
)
db.clientes.insertOne(
  {
    _id: 3,  
    nombre: 'Gonzalez Marta',
    mail: 'gmarta@outlook.com',
    direccion: {
      calle: 'Colon',
      numero: 1200,
      codigopostal: 5000
    }
  }
)
db.clientes.insertOne(
  {
    _id: 4,  
    nombre: 'Ferrero Ariel',
    mail: 'fariel@yahoo.com',
    direccion: {
      calle: 'Dean Funes',
      numero: 23,
      codigopostal: 5002
    }
  }
)
db.clientes.insertOne(
  {
    _id: 5,  
    nombre: 'Fernandez Diego',
    mail: 'fdiego@gmail.com',
    direccion: {
      calle: 'Dean Funes',
      numero: 561,
      codigopostal: 5002
    }
  }
)

db.clientes.createIndex({'direccion.calle':1})

db.clientes.find({'direccion.calle':'Dean Funes'})

Podemos también crear un índice que incluya todos los subcampos:

use base1
db.libros.drop()

db.libros.insertOne(
  {
    _id: 1,  
    titulo: 'El aleph',
    autor: {
      nombre: 'Borges',
      nacionalidad: 'Argentina'
    },
    editorial: ['Siglo XXI','Planeta'],
    precio: 20,
    cantidad: 50 
  }
)
db.libros.insertOne(
  {
    _id: 2,  
    titulo: 'Martin Fierro',
    autor: {
      nombre: 'Jose Hernandez',
      nacionalidad: 'Argentina'
    },
    editorial: ['Siglo XXI'],
    precio: 50,
    cantidad: 12
  }
)
db.libros.insertOne(
  {
    _id: 3,  
    titulo: 'Aprenda PHP',
    autor: {
      nombre: 'Mario Molina',
      nacionalidad: 'Española'
    },
    editorial: ['Siglo XXI','Planeta'],
    precio: 50,
    cantidad: 20
  }
)
db.libros.insertOne(
  {
    _id: 4,  
    autor: {
      nombre: 'Java en 10 minutos',
      nacionalidad: 'Española'
    },
    editorial: ['Siglo XXI'],
    precio: 45,
    cantidad: 1 
  }
)

db.libros.createIndex({autor:1})

db.libros.find({'autor.nombre':'Java en 10 minutos','autor.nacionalidad':'Española'})

El índice se utiliza solo en los casos que en la consulta indiquemos ambos subcampos: 'nombre' y 'nacionalidad'.

Podemos también incluir un campo de tipo arreglo cuando se define un índice.