Chociaż wspomniano, że rzeczywiście $and
operator nie jest wymagany, w obu formach nie jest to żądane zapytanie. Rozważ następujące kwestie:
db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
To w rzeczywistości tak dopasuj podany rekord, ponieważ oba elementy mają wartości „firstName” równe „alice” i „lastName” równe „jones”. Ale oczywiście problem jest prosty, ponieważ w tablicy nie ma rzeczywistego elementu, który zawierałby dokument podrzędny dla obu tych wartości.
Aby dopasować miejsce, w którym element tablicy zawiera „oba” podane kryteria, należy użyć $elemMatch
operator. Stosuje to warunek zapytania do "elementów" tablicy.
db.user.find_one({
'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
I oczywiście, jeśli spróbowałeś "alice" i "jones", to nie byłoby to zgodne, ponieważ żaden element faktycznie nie zawiera tej operacji.