Estoy usando Meteor con MongoDB con una colección de documentos como este:
{a: 'a1',
b: 'b1',
c: {
d: 'd1',
e: 'e1'
}
}
Inicialmente creé un índice como este: collection._ensureIndex({'c.d': 1});
Y corrió consulta como esta: collection.find({c: {d: 'd1'})
. Estos se ejecutaron extremadamente lentamente y cuando depuré con explicar (), me di cuenta de que no estaban usando el índice.
Otoh, si me encontré con una consulta como esta: collection.find({'c.d': 'd1'})
y, a continuación Mongo sería utilizar el índice.
Ahora he cambiado el índice para indexar todo el subdocumento collection._ensureIndex({c: 1})
, es decir , y la primera consulta ahora llega al índice.
Mi pregunta es, ¿es esto un error o una característica? Mi impresión fue que en JSON, las dos notaciones son equivalentes y, francamente, esperaría que una base de datos sea lo suficientemente inteligente como para darse cuenta de que los dos términos de consulta se refieren al mismo campo y usan el índice apropiado.
Mi preocupación con la solución alternativa de indexar todo el subdocumento es que, eventualmente, ese subdocumento puede contener más campos que no necesito indexar, y parece subóptimo perder tiempo y RAM con términos de índice que no necesito.
Si esto no es un error, ¿hay alguna manera de hacer que Mongo reconozca la sintaxis del objeto anidado y use el índice correctamente?
Creo que lo descubrí después de revisar los documentos de Mongo. Básicamente, no es una diferencia en la semántica entre los dos. Básicamente, en la primera forma de la consulta {c: {d: d1}}
, mongo asume que está especificando todo el subdocumento. Entonces, si tiene un subdocumento {c: {d: d1, e: e1}}
, no coincidirá.
OTOH, la segunda forma de la consulta {'c.d': d1}
implica que solo está especificando una coincidencia en un campo dentro del subdocumento. Esto coincidiría incluso si el subdocumento tiene otros campos o subdocumentos completos.
Esta diferencia se extiende al índice. _ensureIndex({c: 1})
y _ensureIndex({'c.d': 1})
son dos índices diferentes, y aunque el primero indexa todo el subdocumento, no se utilizará si consulta en un campo individual con la c.d
notación.
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras