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
berdasarkanbrand_id
lapangan. -
Gunakan $addToSet operator untuk memelihara
products
daftar unikproduct_id
untuk setiap grup. -
Project
count
dariproducts
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
memanggilreduce
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 mengakumulasikanproduct_ids
yang berbeda untuk setiap kunci dan tulisfinalize
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;
}
}
)