Anda dapat dengan mudah menggabungkan hasilnya, daripada memilih solusi pengurangan peta:
-
Matchcatatan di mana tanggal lebih besar dari sama dengan tanggal yang ditentukan. -
Groupberdasarkanbrand_idlapangan. -
Gunakan $addToSet operator untuk memelihara
productsdaftar unikproduct_iduntuk setiap grup. -
Projectcountdariproductslarik 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
mongodbmemanggilreducefungsi 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
reducefungsiyang mengakumulasikanproduct_idsyang berbeda untuk setiap kunci dan tulisfinalizefungsi 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;
}
}
)