javascript - 使用嵌套对象进行 MongoDB 映射缩减

标签 javascript mongodb mapreduce

我正在运行 map 缩减操作,但最终得到了错误的数据。这是我的 map 和归约功能:

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 缩减时:

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之间的值的格式。

换句话说,当您的映射发出 (key, VALUE) 时,您的归约函数必须返回相同格式的 VALUE。

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

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

关于javascript - 使用嵌套对象进行 MongoDB 映射缩减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16432761/

相关文章:

javascript - setInterval 有时会翻倍

javascript - D3折线图-添加线交互: How to get id's and select a line with each?

javascript - 通过reddit排名算法对mongodb进行排序

java - 如何修复 CosmosDB for MongoDB api 上的 'Projection operator not supported' 错误?

java - Hadoop 查找任务尝试的主机名

java - 跨多个客户端和服务器生成真正全局唯一的 ID

javascript - 如何在 Controller 之间共享通用逻辑?

hadoop - 如何在 Reducer 的 close 方法中发出

带有 $lookup 的 MongoDB 聚合仅包含(或项目)一些要从查询返回的字段

apache - 探索 Hadoop 代码