Acho que descobri depois de verificar os documentos do Mongo. Basicamente, existe há uma diferença na semântica entre os dois. Essencialmente, na primeira forma da consulta
{c: {d: d1}}
, o mongo assume que você está especificando o todo subdocumento. Portanto, se você tiver um subdocumento {c: {d: d1, e: e1}}
, não corresponderá. OTOH, a segunda forma da consulta
{'c.d': d1}
implica que você está especificando apenas uma correspondência em um campo dentro do subdocumento. Isso corresponderia mesmo se o subdocumento tiver outros campos ou subdocumentos inteiros. Essa diferença se estende ao índice.
_ensureIndex({c: 1})
e _ensureIndex({'c.d': 1})
são dois índices diferentes e, embora o primeiro indexe todo o subdocumento, ele não será usado se você consultar um campo individual com o c.d
notação.