Si bien se menciona que efectivamente el $and
no se requiere operador, en cualquier forma esta no es la consulta que desea. Considere lo siguiente:
db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
Esto de hecho sí coincida con el registro dado ya que hay ambos elementos con valores de "firstName" igual a "alice" y "lastName" igual a "jones". Pero, por supuesto, el problema aquí es simple, ya que no hay ningún elemento real en la matriz que tenga un subdocumento para ambos valores.
Para hacer coincidir el lugar donde un elemento de matriz contiene "ambos" criterios dados, debe usar $elemMatch
operador. Esto aplica la condición de consulta a los "elementos" de la matriz.
db.user.find_one({
'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
Y, por supuesto, si intentaste "alice" y "jones", eso no coincidiría, ya que ningún elemento contiene esa operación.