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

php data mongo agregat

Struktur data di sini bukanlah implementasi yang baik, ada banyak masalah dengan bagaimana ini terstruktur dan sama sekali tidak cocok untuk agregasi. Masalah utama di sini adalah:

  • Struktur Anda sebenarnya tidak menggunakan array apa pun, saat ini tidak

  • Semua nama kunci spesifik merupakan masalah nyata, dan ini dapat dihindari.

Oleh karena itu, satu-satunya cara untuk melintasi struktur semacam ini adalah menggunakan JavaScript dengan mapReduce.

Mendefinisikan pembuat peta:

var mapper = function () {

  for ( var n in this.versions ) {
    for ( var k in this.versions[n].content ) {
      if (
        ( k != 'confirmed' ) ||
        ( k != 'visited' ) )
          emit(
            {
              type: this.chairtype,
              key: k
            },
            this.versions[n].content[k]
          );
    }
  }

};

Jadi apa yang dilakukan adalah bersepeda melalui setiap entri versi dan kemudian juga melalui semua yang ada di konten. Kunci tersebut dipancarkan untuk setiap tombol konten yang Anda inginkan serta oleh tombol "chairtype". Dan nilainya adalah nilai yang cocok.

Dan kemudian peredam:

var reducer = function (key,values) {

    return ( Array.sum( values ) != 0 ) 
        ? Array.sum( values ) / values.length : 0;

};

Ini hanyalah cara sederhana untuk menghasilkan rata-rata dari semua nilai yang masuk untuk pembuat peta dengan kunci yang sama.

Jadi sementara itu seharusnya bekerja dengan baik, apa yang harus Anda lakukan adalah mengubah struktur Anda. Jadi sebenarnya jika Anda memiliki sesuatu seperti ini:

{
    "_id": ObjectId("52b85dfa32b6249513f15897"),
    "parent": "47de3176-bbc3-44e0-8063-8920ac56fdc8",
    "type": "chair",
    "chairtype": "E",
    "content": [
        { "key": "atkswlntfd", "value": 0, "version": 0 },
        { "key": "auwbsjqzir", "value": 0, "version": 0 },
        { "key": "avqrnjzbgd", "value": 0, "version": 0 }
    ]
}

Atau umumnya kurang lebih dalam bentuk itu, operasi agregasi menjadi sangat sederhana:

db.collection.aggregate([
    { "$unwind": "$content" },
    { "$group": {
       "_id": {
           "chairtype": "$chairtype",
           "key": "$content.key"
       },
       "average": { "$avg": "$content.value" }
    }}
])

Atau variasi lain apa pun yang diperlukan, tetapi sekarang dimungkinkan dengan mengubah strukturnya.

Jadi, tanpa struktur dokumen yang berbeda, Anda perlu menggunakan mapReduce untuk melakukannya.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB menyinkronkan database Pengembangan dan Produksi

  2. Gambaran Umum Pengindeksan Basis Data untuk MongoDB

  3. MongoDB.Driver.Builders cara mengelompokkan dan mendapatkan rata-rata

  4. Ikhtisar Cadangan Percona untuk MongoDB

  5. Pagination pada array yang disimpan dalam bidang dokumen