Jag tror att jag kom på det efter att ha kontrollerat mongodokumenten. I grund och botten finns en skillnad i semantik mellan dessa två. I huvudsak i den första formen av frågan {c: {d: d1}}
, mongo antar att du anger hela underdokument. Så om du har ett underdokument {c: {d: d1, e: e1}}
, det kommer inte att matcha.
OTOH, den andra formen av frågan {'c.d': d1}
innebär att du bara anger en matchning på ett fält i underdokumentet. Detta skulle matcha även om underdokumentet har andra fält eller hela underunderdokument.
Denna skillnad sträcker sig till indexet. _ensureIndex({c: 1})
och _ensureIndex({'c.d': 1})
är två olika index, och även om det första indexerar hela underdokumentet, kommer det inte att användas om du frågar på ett enskilt fält med c.d
notation.