Мисля, че го разбрах, след като проверих документите на mongo. По принцип има разлика в семантиката между тези две. По същество в първата форма на заявката {c: {d: d1}} , mongo приема, че посочвате цялото поддокумент. Така че, ако имате поддокумент {c: {d: d1, e: e1}} , няма да съвпада.
OTOH, втората форма на заявката {'c.d': d1} означава, че посочвате съвпадение само в едно поле в поддокумента. Това ще съответства дори ако поддокументът има други полета или цели под-поддокументи.
Тази разлика се простира до индекса. _ensureIndex({c: 1}) и _ensureIndex({'c.d': 1}) са два различни индекса и въпреки че първият индексира целия поддокумент, той няма да бъде използван, ако правите заявка в отделно поле с c.d нотация.