確かに$and
演算子は必須ではありません。どちらの形式でも、これは必要なクエリではありません。次のことを考慮してください:
db.user.find_one({ 'names.firstName': 'alice','names.lastName': 'jones' })
これは実際には 「firstName」が「alice」に等しく、「lastName」の値が「jones」に等しい両方の要素があるため、指定されたレコードに一致します。しかしもちろん、ここでの問題は単純で、配列にはこれらの値の両方のサブドキュメントを持つ実際の要素がありません。
配列要素に指定された基準の「両方」が含まれる場所を一致させるには、 $elemMatch
オペレーター。これにより、クエリ条件が配列の「要素」に適用されます。
db.user.find_one({
'names': { '$elemMatch': { 'firstName': 'alice','lastName': 'smith' }
})
そしてもちろん、「alice」と「jones」を試した場合、実際にはその操作を含む要素がないため、一致しません。