この動作は、mongoドキュメントここ 。
Mongoは、配列要素の組み合わせがすべての条件に個別に一致したときに結果を返すことで、「スマグ」を喜んでプレイしているようです。
この例では、5は$ lt:20条件に一致し、25は$ gt:10条件に一致します。だから、それは一致です。
次の両方で[5,25]の結果が返されます:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
これがユーザーの期待する行動である場合、意見は異なる可能性があります。しかし、それは確かに文書化されており、期待されるべきです。
編集 、ニールの元の答えに対するサディスティックでありながら非常に教育的な編集のために、解決策を求めています:
$elemMatch の使用 配列のみの「より厳密な」要素比較を行うことができます 。
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
注 :これはx:[11,12]との両方に一致します x:[11,25]
このようなクエリが必要な場合は、2つの組み合わせだと思います クエリが必要であり、結果が組み合わされます。以下は、xが配列ではないドキュメントの正しい結果を返すクエリです。 :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
しかし最善のアプローチ この場合、xのタイプを常にに変更します 要素が1つしかない場合でも、配列になります。次に、期待される動作で正しい結果を得るには、$elemMatchクエリのみが必要です。