Alors qu'il est mentionné qu'en effet le $and
L'opérateur n'est pas requis, dans l'une ou l'autre forme, ce n'est pas la requête que vous voulez. Considérez ce qui suit :
db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
En fait, fait correspondent à l'enregistrement donné car il y a les deux éléments avec des valeurs "firstName" égales à "alice" et "lastName" égales à "jones". Mais bien sûr, le problème ici est simple en ce qu'il n'y a pas d'élément réel dans le tableau qui ait un sous-document pour ces deux valeurs.
Afin de faire correspondre où un élément de tableau contient "les deux" critères donnés, vous devez utiliser le $elemMatch
opérateur. Ceci applique la condition de requête aux "éléments" du tableau.
db.user.find_one({
'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
Et bien sûr, si vous essayez "alice" et "jones", cela ne correspondra pas car aucun élément ne contient réellement cette opération.