MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Kueri mengembalikan hasil yang lebih dari yang diharapkan

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ikhtisar Validasi Skema MongoDB

  2. Bagaimana cara melakukan pencarian $lookup bersarang di MongoDB?

  3. Cara mendorong item baru ke array di dalam objek

  4. Bentuk ulang dokumen dengan membagi nilai bidang

  5. Upser luwak tidak membuat properti skema default