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

Bagaimana cara menanyakan dokumen di mongodb (pymongo) di mana semua kata kunci ada di suatu bidang?

Pertimbangkan untuk menggunakan indeks teks dengan $text cari . Ini mungkin solusi yang jauh lebih baik daripada menggunakan ekspresi reguler. Namun, pencarian teks mengembalikan dokumen berdasarkan algoritma penilaian, sehingga Anda mungkin mendapatkan beberapa hasil yang tidak memiliki semua kata kunci yang Anda cari.

Jika Anda tidak dapat atau tidak ingin menambahkan indeks teks ke bidang ini, menggunakan ekspresi reguler tunggal akan sangat merepotkan karena Anda tidak tahu urutan kemunculan kata-kata ini. Saya tidak mengklaim tidak mungkin untuk menulis, tetapi Anda akan berakhir dengan kekejian yang mengerikan bahkan untuk standar regex. Akan jauh lebih mudah untuk menggunakan operator regex beberapa kali dengan menggunakan $and operator.

Juga, menggunakan spasi sebagai pembatas akan gagal ketika kata berada di awal atau akhir string atau diikuti oleh titik atau koma. Gunakan token batas kata (\b ) sebagai gantinya.

collection.find(
    { $and : [
              {'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
              {'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
              {'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
         ]
    });

Ingatlah bahwa ini adalah kueri yang sangat lambat, karena akan menjalankan tiga ekspresi reguler ini pada setiap dokumen koleksi. Jika ini adalah kueri yang kritis terhadap kinerja, pertimbangkan dengan serius apakah indeks teks benar-benar tidak berfungsi. Jika gagal, hal terakhir yang harus dipahami adalah mengekstrak kata kunci apa pun dari documenttextfield bidang yang dapat ditelusuri seseorang (yang mungkin berupa setiap kata unik di dalamnya) ke dalam bidang larik baru documenttextfield_keywords , buat indeks normal di bidang itu, dan cari di bidang itu dengan $all operator (tidak diperlukan ekspresi reguler dalam kasus itu).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Agregat luwak mengembalikan hasil kosong

  2. Melakukan pembaruan pada jalur '_id' akan mengubah bidang '_id' yang tidak dapat diubah

  3. Tanggal baru() secara agregat $proyek

  4. Cara mengonfigurasi Rebus agar memiliki topik berdasarkan tipe penangan

  5. Grup MongoDB berdasarkan rentang durasi