Es wird zwar erwähnt, dass tatsächlich der $and
Operator nicht erforderlich ist, ist dies in beiden Formen nicht die gewünschte Abfrage. Beachten Sie Folgendes:
db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
Dies tatsächlich mit dem angegebenen Datensatz übereinstimmen, da es beide Elemente mit „firstName“-Werten gleich „alice“ und „lastName“-Werten gleich „jones“ gibt. Aber natürlich ist das Problem hier einfach, da es kein tatsächliches Element im Array gibt, das ein Unterdokument für diese beiden Werte hat.
Um abzugleichen, wo ein Array-Element „beide“ der angegebenen Kriterien enthält, müssen Sie $elemMatch
Operator. Dies wendet die Abfragebedingung auf die "Elemente" des Arrays an.
db.user.find_one({
'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
Und natürlich, wenn Sie "alice" und "jones" versuchten, würde das nicht übereinstimmen, da kein Element diese Operation tatsächlich enthält.