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

Pengoptimalan kueri MongoDB

Yang Anda inginkan adalah hasil "pencarian segi" di mana Anda menyimpan statistik tentang istilah yang cocok dalam kumpulan hasil saat ini. Selanjutnya, meskipun ada produk yang "tampak" melakukan semua pekerjaan dalam satu respons, Anda harus mempertimbangkan bahwa sebagian besar mesin penyimpanan generik akan memerlukan beberapa operasi.

Dengan MongoDB Anda dapat menggunakan dua kueri untuk mendapatkan hasilnya sendiri dan kueri lainnya untuk mendapatkan informasi segi. Ini akan memberikan hasil yang serupa dengan hasil segi yang tersedia dari produk mesin telusur khusus seperti Solr atau ElasticSearch.

Tetapi untuk melakukan ini secara efektif, Anda ingin memasukkan ini ke dalam dokumen Anda dengan cara yang dapat digunakan secara efektif. Formulir yang sangat efektif untuk apa yang Anda inginkan adalah menggunakan array data tokenized:

 {
     "otherData": "something",
     "facets": [
         "country:UK",
         "city:London-UK",
         "genre:Student"
     ]
 }

Jadi "fakta" adalah satu bidang dalam dokumen Anda dan bukan di beberapa lokasi. Ini membuatnya sangat mudah untuk diindeks dan dikueri. Kemudian Anda dapat secara efektif menggabungkan seluruh hasil Anda dan mendapatkan total untuk setiap faset:

User.aggregate(
    [
        { "$unwind": "$facets" },
        { "$group": {
            "_id": "$facets",
            "count": { "$sum": 1 }
        }}
    ],
    function(err,results) {

    }
);

Atau lebih idealnya dengan beberapa kriteria di $match :

User.aggregate(
    [
        { "$match": { "facets": { "$in": ["genre:student"] } } },
        { "$unwind": "$facets" },
        { "$group": {
            "_id": "$facets",
            "count": { "$sum": 1 }
        }}
    ],
    function(err,results) {

    }
);

Akhirnya memberikan respon seperti:

{ "_id": "country:FR", "count": 50 },
{ "_id": "country:UK", "count": 300 },
{ "_id": "city:London-UK", "count": 150 },
{ "_id": "genre:Student": "count": 500 }

Struktur seperti itu mudah untuk dilintasi dan diperiksa untuk hal-hal seperti "negara" terpisah dan "kota" yang dimiliki oleh "negara" karena data tersebut hanya dipisahkan secara konsisten oleh tanda hubung "-".

Mencoba menyatukan dokumen dalam array adalah ide yang buruk. Ada batas ukuran BSON sebesar 16 MB yang harus diperhatikan juga, yang darinya hasil menggabungkan bersama ( terutama jika Anda mencoba untuk menyimpan konten dokumen ) pasti akan dilampaui dalam respons.

Untuk sesuatu yang sederhana seperti kemudian mendapatkan "jumlah keseluruhan" hasil dari kueri seperti itu, maka cukup jumlahkan elemen dari tipe faset tertentu. Atau cukup keluarkan argumen kueri Anda yang sama ke .count() operasi:

User.count({ "facets": { "$in": ["genre:Student"] } },function(err,count) {

});

Seperti yang dikatakan di sini, terutama saat menerapkan "paging" hasil, maka peran mendapatkan "Jumlah Hasil", "Jumlah Faset" dan "Halaman Hasil" yang sebenarnya semuanya didelegasikan ke kueri "terpisah" ke server.

Tidak ada salahnya mengirimkan setiap kueri tersebut ke server secara paralel dan kemudian menggabungkan struktur untuk diumpankan ke template atau aplikasi Anda yang sangat mirip dengan hasil penelusuran segi dari salah satu produk mesin telusur yang menawarkan respons semacam ini.

Penutup

Jadi letakkan sesuatu di dokumen Anda untuk menandai aspek di satu tempat. Array string tokenized bekerja dengan baik untuk tujuan ini. Ini juga berfungsi dengan baik dengan formulir kueri seperti $in dan $all untuk kondisi "atau" atau "dan" pada kombinasi pemilihan faset.

Jangan mencoba dan mash hasil atau penambahan sarang hanya untuk mencocokkan beberapa struktur hierarki yang dirasakan, melainkan melintasi hasil yang diterima dan menggunakan pola sederhana dalam token. Sangat mudah untuk

Jalankan kueri berhalaman untuk konten sebagai kueri terpisah untuk aspek atau jumlah keseluruhan. Mencoba untuk mendorong semua konten dalam array dan kemudian membatasi hanya untuk mendapatkan jumlah tidak masuk akal. Hal yang sama akan berlaku untuk solusi RDBMS untuk melakukan hal yang sama, di mana hasil paging dihitung dan halaman saat ini adalah operasi kueri yang terpisah.

Ada lebih banyak informasi yang ditulis di Blog MongoDB tentang Faceted Search dengan MongoDB yang juga menjelaskan beberapa opsi lainnya. Ada juga artikel tentang integrasi dengan solusi pencarian eksternal menggunakan mongoconnector atau pendekatan lain.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. nama bidang batchSize diabaikan dalam Proyeksi Bidang

  2. Cara memperbarui subdokumen di mongodb

  3. Enam Komponen Penting dari Tata Kelola Data yang Berhasil

  4. 8 Cara Mendapatkan Hari dari Kencan di MongoDB

  5. Dapatkan bagian tertentu dari dokumen