Embora seja mencionado que, de fato, o
$and
operador não é necessário, de qualquer forma esta não é a consulta que você deseja. Considere o seguinte:db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
Isso de fato faz corresponder ao registro dado, pois há ambos os elementos com valores "firstName" iguais a "alice" e "lastName" iguais a "jones". Mas é claro que o problema aqui é simples, pois não há nenhum elemento real no array que tenha um subdocumento para ambos os valores.
Para corresponder onde um elemento de matriz contém "ambos" os critérios fornecidos, você precisa usar o
$elemMatch
operador. Isso aplica a condição de consulta aos "elementos" da matriz. db.user.find_one({
'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
E, claro, se você tentasse "alice" e "jones", isso não corresponderia, pois nenhum elemento realmente contém essa operação.