Myślę, że zrozumiałem to po sprawdzeniu dokumentów mongo. Zasadniczo jest różnica w semantyce między tymi dwoma. Zasadniczo w pierwszej formie zapytania {c: {d: d1}} , mongo zakłada, że określasz całość poddokument. Więc jeśli masz poddokument {c: {d: d1, e: e1}} , nie będzie pasować.
OTOH, druga forma zapytania {'c.d': d1} oznacza, że określasz dopasowanie tylko w jednym polu w poddokumencie. Byłoby to zgodne, nawet jeśli poddokument zawiera inne pola lub całe poddokumenty.
Ta różnica rozciąga się na indeks. _ensureIndex({c: 1}) i _ensureIndex({'c.d': 1}) to dwa różne indeksy i chociaż pierwszy indeksuje cały dokument podrzędny, nie będzie on używany, jeśli zapytanie dotyczy pojedynczego pola z c.d notacja.