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

Mengelompokkan dokumen berpasangan menggunakan agregasi mongo

Ini adalah sesuatu yang tidak dapat dilakukan dengan kerangka kerja agregasi, dan satu-satunya metode MongoDB saat ini yang tersedia untuk jenis operasi ini adalah mapReduce.

Alasannya adalah bahwa kerangka kerja agregasi tidak memiliki cara untuk merujuk ke dokumen lain dalam alur selain yang sekarang. Ini sebenarnya berlaku untuk tahap pipa "pengelompokan" juga, karena meskipun hal-hal dikelompokkan pada "kunci", Anda tidak dapat benar-benar menangani dokumen individual seperti yang Anda inginkan.

MapReduce di sisi lain memiliki satu fitur yang tersedia yang memungkinkan Anda untuk melakukan apa yang Anda inginkan di sini, dan itu bahkan tidak "langsung" terkait dengan agregasi. Sebenarnya kemampuan untuk memiliki "variabel lingkup global" di semua tahap. Dan memiliki "variabel" untuk pada dasarnya "menyimpan dokumen terakhir" adalah semua yang Anda butuhkan untuk mencapai hasil Anda.

Jadi ini kode yang cukup sederhana, dan sebenarnya tidak ada "pengurangan" yang diperlukan:

db.collection.mapReduce(
    function () {
      if (lastVal != null)
        emit( this._id, this.val - lastVal );
      lastVal = this.val;
    },
    function() {}, // mapper is not called
    {
        "scope": { "lastVal": null },
        "out": { "inline": 1 }
    }
)

Yang memberi Anda hasil seperti ini:

{
    "results" : [
            {
                    "_id" : ObjectId("54a425a99b8bcd6f73e2d662"),
                    "value" : 2
            },
            {
                    "_id" : ObjectId("54a425a99b8bcd6f73e2d663"),
                    "value" : 3
            },
            {
                    "_id" : ObjectId("54a425a99b8bcd6f73e2d664"),
                    "value" : 4
            }
    ],
    "timeMillis" : 3,
    "counts" : {
            "input" : 4,
            "emit" : 3,
            "reduce" : 0,
            "output" : 3
    },
    "ok" : 1
}

Itu benar-benar hanya memilih "sesuatu yang unik" sebagai _id yang dipancarkan nilai daripada sesuatu yang spesifik, karena semua ini benar-benar dilakukan adalah perbedaan antara nilai-nilai pada dokumen yang berbeda.

Variabel global biasanya merupakan solusi untuk jenis agregasi "penyandingan" ini atau menghasilkan "total berjalan". Saat ini kerangka kerja agregasi tidak memiliki akses ke variabel global, meskipun mungkin ini bagus untuk dimiliki. Kerangka kerja mapReduce memilikinya, jadi mungkin adil untuk mengatakan bahwa mereka juga harus tersedia untuk kerangka kerja agregasi.

Saat ini tidak, jadi tetap gunakan mapReduce.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tanyakan MongoDB apakah itu Master dari bashscript

  2. Baru di MongoDB Tidak dapat menjalankan perintah mongo

  3. cara menggunakan mongoimport untuk mengimpor file json

  4. Cara menangani panggilan balik dalam for loop (Node.JS)

  5. luwak (mongodb) Alias ​​_id field