Sebbene sia menzionato che in effetti $and
operatore non è richiesto, in nessuna delle due forme questa non è la query che desideri. Considera quanto segue:
db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
Questo infatti fa corrisponde al record dato in quanto sono presenti entrambi gli elementi con "firstName" uguale a "alice" e "lastName" valori uguali a "jones". Ma ovviamente il problema qui è semplice in quanto non esiste alcun elemento effettivo nell'array che abbia un documento secondario per entrambi questi valori.
Per far corrispondere dove un elemento dell'array contiene "entrambi" i criteri forniti, è necessario utilizzare $elemMatch
operatore. Questo applica la condizione della query agli "elementi" dell'array.
db.user.find_one({
'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
E, naturalmente, se provassi "alice" e "jones", non corrisponderebbero poiché nessun elemento contiene effettivamente quell'operazione.