Perilaku ini diharapkan dan dijelaskan dalam dokumentasi mongo di sini .
Mongo tampaknya bersedia bermain "sombong", dengan memberikan kembali hasil ketika kombinasi elemen array cocok dengan semua kondisi secara independen.
Dalam contoh kita, 5 cocok dengan kondisi $lt:20 dan 25 cocok dengan kondisi $gt:10. Jadi, ini cocok.
Kedua hal berikut akan mengembalikan hasil [5,25]:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
Jika ini adalah perilaku yang diharapkan pengguna, pendapat dapat bervariasi. Tapi itu pasti didokumentasikan, dan harus diharapkan.
Sunting , untuk suntingan Neil yang sadis namun sangat mendidik untuk jawaban asli, meminta solusi:
Penggunaan $elemMatch dapat membuat perbandingan elemen "lebih ketat" untuk array saja .
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
Catatan :ini akan cocok dengan x:[11,12] dan x:[11,25]
Saya percaya ketika kueri seperti ini diperlukan, kombinasi pada dua kueri diperlukan, dan hasilnya digabungkan. Di bawah ini adalah kueri yang mengembalikan hasil yang benar untuk dokumen dengan x menjadi bukan larik :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
Tapi pendekatan terbaik dalam hal ini adalah mengubah jenis x menjadi selalu menjadi array, meskipun hanya berisi satu elemen. Kemudian, hanya kueri $elemMatch yang diperlukan untuk mendapatkan hasil yang benar, dengan perilaku yang diharapkan.