Je pense que je l'ai compris après avoir vérifié les documents mongo. Fondamentalement, il existe une différence de sémantique entre les deux. Essentiellement, dans la première forme de la requête {c: {d: d1}}
, mongo suppose que vous spécifiez l'intégralité sous-document. Donc si vous avez un sous-document {c: {d: d1, e: e1}}
, cela ne correspondra pas.
OTOH, la deuxième forme de la requête {'c.d': d1}
implique que vous ne spécifiez qu'une correspondance sur un champ dans le sous-document. Cela correspondrait même si le sous-document contient d'autres champs ou des sous-sous-documents entiers.
Cette différence s'étend à l'indice. _ensureIndex({c: 1})
et _ensureIndex({'c.d': 1})
sont deux index différents, et même si le premier indexe l'intégralité du sous-document, il ne sera pas utilisé si vous effectuez une requête sur un champ individuel avec le c.d
notation.