How to Group mongodb - mapReduce output?

后端 未结 3 731
余生分开走
余生分开走 2020-12-11 22:19

i have a query regarding the mapReduce framework in mongodb, so i have a result of key value pair from mapReduce function , now i want to run the query on this output of map

相关标签:
3条回答
  • 2020-12-11 23:03

    Try this,

    db.order.mapReduce(function() { emit (this.customer,{count:1,orderDate:this.orderDate.interval_start}) },
    function(key,values){ 
    var category; // add this new field
    var sum =0 ; var lastOrderDate;  
    values.forEach(function(value) {
     if(value['orderDate']){ 
        lastOrderDate=value['orderDate'];
    }  
    sum+=value['count'];
    }); 
    // at this point you are already aware in which category your records lies , just add a new field to mark it
     if(sum < 5){ category: userLessThan5};
     if(sum >= 5 && sum <=10){ category: user5to10};
     if(sum <= 10 && sum >= 15){ category: user10to15};
     if(sum <= 15 && sum >=20){ category: user15to20};
      ....
    return {count:sum,lastOrderDate:lastOrderDate,category:category}; 
    },
    { query:{status:"DELIVERED"},out:"order_total"}).find()
     db.order_total.aggregate([{ $group: { "_id": "$value.category", "users": { $sum: 1 } } }]);
    

    you will get you desired result

    {userLessThan5: 9 }
    {user5to10: 2 }
    {user10to15: 1 }
    {user15to20: 0 }
     ....
    
    0 讨论(0)
  • 2020-12-11 23:14

    You could try to group the output data after mapreduce to every 5 interval count through aggregate like below

    db.data.aggregate([
        { "$group": {
            "_id": {
                "$subtract": [
                    { "$subtract": [ "$value.count", 0 ] },
                    { "$mod": [ 
                        { "$subtract": [ "$value.count", 0 ] },
                        5
                    ]}
                ]
            },
            "count": { "$sum": 1 }
        }}
    ])
    

    Also maybe here is one related question here.

    0 讨论(0)
  • 2020-12-11 23:19

    I wrote a query using your data in aggregation as per my knowledge, there may be better way to solve this problem.

    var a=db.test.aggregate([{$match:{"value.count":{$lt:5}}},
                  { $group: { _id:"$value.count",total:{"$sum":1}}},
                 {$group:{_id:"less than 5",total:{$sum:"$total"}}}])              
    
    var b=db.test.aggregate([{$match:{"value.count":{$lt:10,$gt:5}}},
                { $group: { _id:"$value.count",total:{"$sum":1}}},
                {$group:{_id:"between 5 and 10",total:{$sum:"$total"}}}])
    
    var c=db.test.aggregate([{$match:{"value.count":{$lt:15,$gt:10}}},
           { $group: { _id:"$value.count",total:{"$sum":1}}},
           {$group:{_id:"between 10 and 15",total:{$sum:"$total"}}}])
    

    insert a, b, c into another collection

    0 讨论(0)
提交回复
热议问题