$ existen no va a usar el índice, pero se puede cambiar la estructura de datos para
photos: [
{id:123, url: '...', title: '...', ... },
{id:456, url: '...', title: '...', ... },
...
]
y luego usar
db.users.ensureIndex({photos.id:1})
para crear un índice para el carnet de identidad.
Parece que estoy equivocado, de hecho, puede forzar su consulta $ exists para usar su índice. Vamos a seguir usando la estructura anterior, pero su identificación con foto no está ciertamente contenida, es decir algunos documentos tendrán la clave 'id' y otros no. A continuación, puede crear índice disperso en él:
db.users.ensureIndex({'photos.id': 1}, {'sparse': true})
entonces consulta como esta:
db.users.find({'photos.id': {$exists: true}}).hint({'photos.id': 1})
puede agregar a explicar para ver si la consulta está utilizando índice. Aquí está mi resultado, la llave móvil de mi colección es similar a su photos.id:
> db.test.count()
50000
> db.test.find({'mobile': {$exists: true}}).hint({'mobile': 1}).explain()
{
"cursor" : "BtreeCursor mobile_1",
"nscanned" : 49999,
"nscannedObjects" : 49999,
"n" : 49999,
"millis" : 138,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"mobile" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}
> db.test.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.test",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"mobile" : 1
},
"ns" : "test.test",
"name" : "mobile_1",
"sparse" : true,
"background" : true
}
]
Esperanza para ayudar!
Genial, gracias por la confirmación. – bantic
¡NO! Probé con mongodb 2.4.3 y UTILIZA el índice. Tenga en cuenta que los campos inexistentes tienen valor nulo en el índice. –
MongoDB 3.0.3: 'explain' para ambos' find ({field: {$ exists: 1}}) 'y' find ({field: {$ ne: null}}) 'parece que va a usar index, pero mientras que la segunda consulta finaliza de manera instantánea, la primera prueba (con exploración completa, supongo). – vorou