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

Mongo Map-Reduce To Mimic count(distinct(...)) group by in SQL

Anda dapat dengan mudah menggabungkan hasilnya, daripada memilih solusi pengurangan peta:

  • Match catatan di mana tanggal lebih besar dari sama dengan tanggal yang ditentukan.

  • Group berdasarkan brand_id lapangan.

  • Gunakan $addToSet operator untuk memelihara products daftar unikproduct_id untuk setiap grup.

  • Project count dari products larik di setiap kunci.

Kode:

db.collection.aggregate([
{$match:{"date":{$gte:new Date('2014-11-20')}}},
{$group:{"_id":"$brand_id","products":{$addToSet:"$product_id"}}},
{$project:{"_id":0,"brand_id":"$_id","distinct_prod":{$size:"$products"}}}
])

Datang ke solusi pengurangan peta Anda,

Itulah salah satu cara mongodb dapat memanggil fungsi pengurangan untuk setiap grup. Dari dokumen :

Anda perlu membuat beberapa modifikasi pada map ,reduce fungsi dan tambahkan finalize . baru fungsi:

  • Anda harus ingat bahwa ketika mongodb memanggil reduce fungsi untuk kunci yang sama lebih dari satu kali, hasil dari pemanggilan sebelumnya diteruskan sebagai input ke fungsi reduksi, bersama dengan nilai lainnya saat fungsi reduksi berikutnya dipanggil.
  • Poin pertama, Jadi, Anda perlu memastikan input ke fungsi reduksi dan nilai kembalian dari fungsi reduksi dibangun dengan cara yang sama, sehingga logika yang tertulis di dalam fungsi reduksi dapat mengakomodasi pemrosesan nilai yang dikembalikannya sendiri dalam panggilan sebelumnya.
  • Karena kita tidak akan dapat mengambil jumlah nilai yang berbeda ketika dipanggil dalam batch, yang dapat kita lakukan adalah, menulis reduce fungsiyang mengakumulasikan product_ids yang berbeda untuk setiap kunci dan tulis finalize fungsi yang menghitung jumlah nilai unik tersebut.

Kode:

db.collection.mapReduce(
    function() {
        // emitting the same structure returned by the reduce function.
        emit(this.brand_id, {"prod_id":[this.product_id]});
    },
    function(key, values) {
       // the return value would be a list of unique product_ids.
        var res = {"prod_id":[]};
        for(var i=0;i<values.length;i++)
        {
         for(var j=0;j<values[i].prod_id.length;j++){
            if(res.prod_id.indexOf(values[i].prod_id[j]) == -1){
                res.prod_id.push(values[i].prod_id[j]);
            }
        }}
        return res;
    },
    {
        query: {date: {$gte: new Date('2014-11-20')}},
        out: "example",
        finalize: function(key, reducedValue){
            // it returns just the count
            return reducedValue.prod_id.length;
        }
    }
)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Copot pemasangan MongoDB di Mac OS X

  2. Mongodb:proyeksi elemen array dengan findOneAndUpdate tidak berfungsi?

  3. Basis data lebih dari 2GB di MongoDB

  4. Bagaimana cara mencari string dalam larik dokumen MongoDB dan memproyeksikan nilai larik dalam operasi pencarian?

  5. Bagaimana Memulai dengan ClusterControl