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

Menggunakan map/reduce untuk memetakan properti dalam koleksi

Oke, ini sedikit lebih rumit karena Anda harus menggunakan beberapa rekursi.

Untuk membuat rekursi terjadi, Anda harus dapat menyimpan beberapa fungsi di server.

Langkah 1:tentukan beberapa fungsi dan letakkan di sisi server

isArray = function (v) {
  return v && typeof v === 'object' && typeof v.length === 'number' && !(v.propertyIsEnumerable('length'));
}

m_sub = function(base, value){
  for(var key in value) {
    emit(base + "." + key, null);
    if( isArray(value[key]) || typeof value[key] == 'object'){
      m_sub(base + "." + key, value[key]);
    }
  }
}

db.system.js.save( { _id : "isArray", value : isArray } );
db.system.js.save( { _id : "m_sub", value : m_sub } );

Langkah 2:tentukan peta dan kurangi fungsi

map = function(){
  for(var key in this) {
    emit(key, null);
    if( isArray(this[key]) || typeof this[key] == 'object'){
      m_sub(key, this[key]);
    }
  }
}

reduce = function(key, stuff){ return null; }

Langkah 3:jalankan pengurangan peta dan lihat hasilnya

mr = db.runCommand({"mapreduce" : "things", "map" : map, "reduce" : reduce,"out": "things" + "_keys"});
db[mr.result].distinct("_id");

Hasil yang akan Anda dapatkan adalah:

["_id", "_id.isObjectId", "_id.str", "_id.tojson", "egg", "egg.0", "foo", "foo.bar", "foo.bar.baaaar", "hello", "type", "type.0", "type.1"]

Ada satu masalah yang jelas di sini, kami menambahkan beberapa bidang tak terduga di sini:1. _id data2. .0 (pada telur dan ketik)

Langkah 4:Beberapa kemungkinan perbaikan

Untuk masalah #1 perbaikannya relatif mudah. Cukup ubah map fungsi. Ubah ini:

emit(base + "." + key, null); if( isArray...

untuk ini:

if(key != "_id") { emit(base + "." + key, null); if( isArray... }

Masalah #2 adalah sedikit lebih tidak pasti. Anda ingin semua kunci dan secara teknis "telur.0" adalah kunci yang valid. Anda dapat mengubah m_sub untuk mengabaikan tombol numerik tersebut. Tetapi juga mudah untuk melihat situasi di mana ini menjadi bumerang. Katakanlah Anda memiliki array asosiatif di dalam array biasa, maka Anda ingin "0" itu muncul. Saya akan menyerahkan sisa solusi itu kepada Anda.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mengintegrasikan ClusterControl dengan SNMP :Bagian Kedua

  2. mongodb versi 3.0.0 klien robomongo mongovue

  3. Agregasi MongoDB dengan driver Java

  4. Gambar mongo Docker 'Koneksi ditolak' dari wadah lain

  5. Cara Mendapatkan Hari, Bulan, dan Tahun dari Tanggal di SQL