Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用嵌套对象的MongoDB map reduce_Javascript_Mongodb_Mapreduce - Fatal编程技术网

Javascript 使用嵌套对象的MongoDB map reduce

Javascript 使用嵌套对象的MongoDB map reduce,javascript,mongodb,mapreduce,Javascript,Mongodb,Mapreduce,我正在运行一个map reduce操作,结果是数据错误。以下是我的map和reduce函数: var map_analytics = function() { var key = this.owner; if (this.apikey == null) { var value = {api_call_with_key: 0, api_call_without_key: 1}; } else { var value = {api_call_w

我正在运行一个map reduce操作,结果是数据错误。以下是我的map和reduce函数:

var map_analytics = function() {
    var key = this.owner;
    if (this.apikey == null) {
        var value = {api_call_with_key: 0, api_call_without_key: 1};
    } else {
        var value = {api_call_with_key: 1, api_call_without_key: 0};
    }
    emit(key, value);
};

var reduce_analytics  = function(key_owner, api_calls) {
    today = new Date();
    firstofmonth = new Date(today.getFullYear(), today.getMonth(), 1);
    reduced_val = {period: firstofmonth, analytics: {api_call_with_key: 0, api_call_without_key: 0}};
    api_calls.forEach(function(value) {
        reduced_val.analytics.api_call_with_key += value.api_call_with_key;
        reduced_val.analytics.api_call_without_key += value.api_call_without_key;
    });
    return reduced_val;
};
现在,当我运行map reduce时:

db.statistics.mapReduce(map_analytics, reduce_analytics, {out: { reduce: "analytics" }, query: { request_date: { $gte: firstofmonth}}})
我明白了:

{
        "_id" : ObjectId("5136d880136b961c98c9a62f"),
        "value" : {
                "period" : ISODate("2013-05-01T06:00:00Z"),
                "analytics" : {
                        "api_call_with_key" : NaN,
                        "api_call_without_key" : NaN
                }
        }
}
知道为什么我得到的是NaN而不是实际值吗?

更简单的版本是:

var reduce_analytics  = function(key_owner, api_calls) {
    reduced_val = {api_call_with_key: 0, api_call_without_key: 0};
    api_calls.forEach(function(value) {
        reduced_val.api_call_with_key += value.api_call_with_key;
        reduced_val.api_call_without_key += value.api_call_without_key;
    });
    return reduced_val;
};
生产

{
        "_id" : ObjectId("5143b2c8136b9616343dacec"),
        "value" : {
                "api_call_with_key" : 0,
                "api_call_without_key" : 2,
                "total_api_calls" : 2
        }
}

如何输出更复杂的对象?

您不能在map和reduce之间更改值的格式

换句话说,当地图发出(键、值)时,reduce函数必须返回相同的格式值

因此,如果希望将日期作为值的一部分,则需要在映射阶段将其放入。如果您是按键、日期分组,那么它应该是键文档的一部分


此外,如果可以的话,我建议使用聚合框架进行此操作—它比map reduce快得多。

您不能在map和reduce之间更改值的格式

换句话说,当地图发出(键、值)时,reduce函数必须返回相同的格式值

因此,如果希望将日期作为值的一部分,则需要在映射阶段将其放入。如果您是按键、日期分组,那么它应该是键文档的一部分

此外,如果可以的话,我建议您为此使用聚合框架—它比map reduce快得多。

尝试以下方法:

api_calls.forEach(function(value) {
    reduced_val.analytics.api_call_with_key += Number(value.api_call_with_key);
    reduced_val.analytics.api_call_without_key += Number(value.api_call_without_key);
});
试试这个:

api_calls.forEach(function(value) {
    reduced_val.analytics.api_call_with_key += Number(value.api_call_with_key);
    reduced_val.analytics.api_call_without_key += Number(value.api_call_without_key);
});

请记住,reduce函数可能被称为零,每个键值调用一次或多次。这是正确的答案。谢谢。请记住,reduce函数对于每个键值可以调用零、一次或多次。我在这里也发现了这一点:。这是正确的答案。谢谢