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

Cara menanyakan elemen relatif menggunakan MongoDB

Segala sesuatu tentang ini cukup mengerikan, Anda tidak mungkin mengindeks sesuatu seperti nilai "nama" dan "jalur" Anda ke setiap atribut akan bervariasi di mana-mana. Jadi ini sangat buruk untuk kueri.

Saya perhatikan Anda menyebutkan struktur "bersarang", dan Anda masih dapat mengakomodasi ini dengan proposal serupa dan beberapa penandaan tambahan, tetapi saya ingin Anda mempertimbangkan contoh jenis "buku telepon" ini:

{
    "phones": [
        {
           "type": "Home",
           "name" : "Jeff",
           "phone" : "123-123-1234"
        },
        {
           "type": "Work",
           "name" : "Jeff",
           "phone" : "123-123-1234"
        },
    ]
}

Karena ini sebenarnya adalah sub-dokumen dalam array, bidang seperti "nama" selalu berbagi jalur yang sama, jadi Anda tidak hanya dapat mengindeks ini (yang akan baik untuk kinerja), tetapi kuerinya sangat mendasar:

db.collection({ "phones.name": "Jeff" })

Itu melakukan persis apa yang Anda butuhkan dengan menemukan "Jeff" di entri "nama" apa pun. Jika Anda memerlukan hierarki, tambahkan beberapa bidang di sub-dokumen tersebut untuk menunjukkan hubungan induk/anak yang dapat Anda gunakan dalam pemrosesan pasca. Atau bahkan sebagai jalur terwujud yang dapat membantu pertanyaan Anda.

Ini benar-benar pendekatan yang lebih baik.

Jika Anda benar-benar harus mempertahankan struktur semacam ini maka setidaknya lakukan sesuatu seperti ini dengan JavaScript yang akan menyelamatkan pada pertandingan pertama secara mendalam:

db.collection.find(
  function () {
    var found = false;

    var finder = function( obj, field, value ) {
      if ( obj.hasOwnProperty(field) && obj[field] == value )
        found = true;

      if (found) return true;

      for( var n in obj ) {
        if ( Object.prototype.toString.call(obj[n]) === "[object Object]" ) {
          finder( obj[n], field, value );
          if (found) return true;
        }
      }

    };

    finder( this, "name", "Jeff" );
    return found;

  }
)

Formatnya adalah notasi singkatan untuk $where operator, yang merupakan berita buruk untuk kinerja, tetapi struktur Anda tidak menawarkan banyak pilihan lain. Bagaimanapun, fungsi harus berulang ke setiap dokumen bersarang sampai "bidang" dengan "nilai" ditemukan.

Untuk skala produksi apa pun, lihat benar-benar mengubah struktur menjadi sesuatu yang dapat diindeks dan diakses dengan cepat. Contoh pertama akan memberi Anda titik awal. Mengandalkan JavaScript arbitrer untuk kueri karena struktur Anda saat ini membatasi Anda adalah berita buruk.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Perbandingan tanggal di mongodb

  2. Masalah MongoDB \uXXXX

  3. Bagaimana cara menangkap MongoSecurityException?

  4. Bagaimana cara mengimplementasikan has_many :melalui hubungan dengan Mongoid dan mongodb?

  5. Android/MongoDB:NoClassDefFoundError:com.mongodb.DBPortPool