Jeg tror, jeg fandt ud af det efter at have tjekket mongo-dokumenterne. Grundlæggende er en forskel i semantik mellem de to. I det væsentlige, i den første form af forespørgslen {c: {d: d1}}
, mongo antager, at du angiver hele underdokument. Så hvis du har et underdokument {c: {d: d1, e: e1}}
, vil det ikke matche.
OTOH, den anden form af forespørgslen {'c.d': d1}
betyder, at du kun angiver et match på ét felt i underdokumentet. Dette ville matche, selvom underdokumentet har andre felter eller hele underunderdokumenter.
Denne forskel strækker sig til indekset. _ensureIndex({c: 1})
og _ensureIndex({'c.d': 1})
er to forskellige indekser, og selvom det første indekserer hele underdokumentet, vil det ikke blive brugt, hvis du forespørger på et individuelt felt med c.d
notation.