Creo que lo descubrí después de revisar los documentos de mongo. Básicamente, hay es una diferencia en la semántica entre esos dos. Esencialmente, en la primera forma de la consulta {c: {d: d1}}
, mongo asume que estás especificando el todo 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 sub-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 un campo individual con el c.d
notación.