Även om det nämns att $and
operator krävs inte, i någon av formerna är detta inte den fråga du vill ha. Tänk på följande:
db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
Detta gör faktiskt matcha den givna posten eftersom det finns båda element med "firstName" lika med "alice" och "lastName" värden lika med "jones". Men naturligtvis är problemet här enkelt i det att det inte finns något egentligt element i arrayen som har ett underdokument för båda dessa värden.
För att matcha där ett arrayelement innehåller "båda" de angivna kriterierna måste du använda $elemMatch
operatör. Detta tillämpar frågevillkoret på "elementen" i arrayen.
db.user.find_one({
'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
Och naturligtvis om du försökte "alice" och "jones" så skulle det inte matcha eftersom inget element faktiskt innehåller den operationen.