【问题标题】:Retrive sum along with count in mongodb using mapReduce使用 mapReduce 在 mongodb 中检索 sum 和 count
【发布时间】:2015-02-28 12:11:35
【问题描述】:

如何使用 mapReduce 将以下 SQL 查询转换为 mongoDB

SELECT mobile, SUM( amount ),count(mobile) as noOfTimesRecharges
FROM recharge
WHERE recharge_date  between  '2015-02-26' AND  '2015-03-27'
GROUP BY mobile
having noOfTimesRecharges > 0 and  noOfTimesRecharges < 5

我试过了

db.users.mapReduce(
function(){
emit(this.mobile,this.amount);
},
function(k,v){
return Array.sum(v)
},
{
query:{
recharge_date:{$gte:ISODate("2014-06-17"),$lte:ISODate("2014-06-20")}
},
out:"one_month_data" 
}).find();

这给了我结果,但不是计数。

【问题讨论】:

    标签: javascript mongodb mapreduce mongodb-query aggregation-framework


    【解决方案1】:

    所以在这种情况下,您可能真的想要aggregation framework。它在本机代码操作中运行,比 mapReduce 的 JavaScript 评估要快得多。

    db.users.aggregate([
        { "$match": {
            "recharge_date": {
                "$gte": ISODate("2014-06-17"),
                "$lte": ISODate("2014-06-20")
            }
        }},
        { "$group": {
            "_id": "$mobile",
            "amount": { "$sum": "$amount" },
            "count": { "$sum": 1 }
        }},
        { "$match": {
            "count": { "$gt": 1, "lt": 5 }
        }}
        { "$out": "newCollection" }
    ],
    { "allowDiskUse": true }
    )
    

    代码效率更高,代码也非常简单。

    还可以查看SQL to agregation mapping chart 了解常见示例。

    如果您确实需要 mapReduce(而且您可能不需要),那么正确的方法是:

    db.users.mapReduce(
        function() { 
            emit( this.mobile, { "amount": this.amount, "count": 1 } );
        },
        function(key,values) {
            var doc = { "amount": 0, "count": 0 };
            values.forEach(function(value) {
                doc.amount += value.amount;
                doc.count += value.count;
            };
            return doc;
       },
       { 
           "out": { "replace": "newCollection" },
           "query": {
               "recharge_date": {
                   "$gte": ISODate("2014-06-17"),
                   "$lte": ISODate("2014-06-20")
                }
           }
       }
    )
    

    但是,在“限制”结果方面,您不会得到与聚合管道相同的情况,而无需对结果集合进行额外处理。

    【讨论】:

    • 我有大约 1000 万条记录使用聚合给我 16MB 限制的内存错误
    • @Vibhas 这就是为什么你使用allowDiskUse 作为参数
    • 是的,你是对的,但我仍然如何添加有子句来限制分组结果
    • @Vibhas 你说的是 NoSQL 世界中的 SQL,这看起来并不好看。解释你的意思。哪个 BTW 不在您的原始问题中,因为我已经回答了。
    猜你喜欢
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多