MongoDB MapReduce奇怪的bug

时间:2015-04-18 10:37:06

标签: node.js mongodb express

我正在尝试这个简单的MapReduce操作:

function map() {

    var gameDay = Math.floor((this.matchCreation - 1427846400000) / 86400000) + 1; // day of april 2015 when the game was played


    this.teams.forEach (function (team){

        **team.bans.forEach(function (ban){** // says bans is undefined

            var value ={
                banned : 1,
                firstBanned: ( ((ban.pickTurn == 1) || (ban.pickTurn == 2))? 1 : 0 )

            }

            emit({championId: ban.championId,
                  day: Number(gameDay)}, value);
            emit({championId: ban.championId,
                  day: "all"}, value);

        });

    });

}

function reduce(key, values) {

    var a = values[0];

    for(var i = 1 ; i<values.length ; i++){

        var b = values[i]; // will merge 'b' into 'a'

        a.banned += (b.banned? b.banned : 0);
        a.firstBanned += (b.firstBanned? b.firstBanned : 0);

        for (var attrname in b){

            if(attrname != "banned" && attrname != "firstBanned")
                a[attrname] = b[attrname];

        }

    }

    return a;

}

matchesCollection.mapReduce(map, reduce, {
    out: { reduce: "mapReduceResults" }

}, function (err, data){

    if(err)
        return callback (err);


    callback (null, "OK");


});

以前它曾经工作过,但是当我尝试在测试一段时间之后部署应用程序时,它似乎在这一行中失败了: team.bans.forEach(function(ban){ ,team.bans是未定义的,尽管每个文档中的每个文件都有一个“团队”数组和一个“禁止”数组,我甚至通过查询数据库来检查它,并且没有文档中的那些田野不存在。

太奇怪了。 reduce函数有点复杂,但似乎工作正常,但是map(与Reduce不同,它原本应该在每个原始文档中调用一次,对吧?)会抛出这个无法解释的错误。谁能给我一些见解?

示例输入:

{
"_id": {
    "$oid": "5531a63f2a3f135c11ed14a8"
},
"matchId": 1778704162,
"region": "NA",
"platformId": "NA1",
"matchMode": "CLASSIC",
"matchType": "MATCHED_GAME",
"matchCreation": 1427864425511,
"matchDuration": 1431,
"queueType": "URF_5x5",
"mapId": 11,
"season": "SEASON2015",
"matchVersion": "5.6.0.194",
"participants": [
    {
        "teamId": 100,
        "spell1Id": 12,
        "spell2Id": 4,
        "championId": 81,
        "highestAchievedSeasonTier": "SILVER",
        "timeline": [],
        "masteries": [],
        "stats": {
            "winner": false,
            "champLevel": 19,
            "item0": 1037,
            "item1": 3078,
            "item2": 3117,
            "item3": 3035,
            "item4": 3072,
            "item5": 1038,
            "item6": 3340,
            "kills": 7,
            "doubleKills": 1,
            "tripleKills": 0,
            "quadraKills": 0,
            "pentaKills": 0,
            "unrealKills": 0,
            "largestKillingSpree": 3,
            "deaths": 15,
            "assists": 9,
            "totalDamageDealt": 103191,
            "totalDamageDealtToChampions": 22148,
            "totalDamageTaken": 32924,
            "largestCriticalStrike": 669,
            "totalHeal": 2263,
            "minionsKilled": 97,
            "neutralMinionsKilled": 1,
            "neutralMinionsKilledTeamJungle": 1,
            "neutralMinionsKilledEnemyJungle": 0,
            "goldEarned": 13923,
            "goldSpent": 13273,
            "combatPlayerScore": 0,
            "objectivePlayerScore": 0,
            "totalPlayerScore": 0,
            "totalScoreRank": 0,
            "magicDamageDealtToChampions": 6082,
            "physicalDamageDealtToChampions": 15803,
            "trueDamageDealtToChampions": 263,
            "visionWardsBoughtInGame": 0,
            "sightWardsBoughtInGame": 0,
            "magicDamageDealt": 45997,
            "physicalDamageDealt": 56651,
            "trueDamageDealt": 543,
            "magicDamageTaken": 25249,
            "physicalDamageTaken": 7490,
            "trueDamageTaken": 184,
            "firstBloodKill": false,
            "firstBloodAssist": false,
            "firstTowerKill": false,
            "firstTowerAssist": false,
            "firstInhibitorKill": false,
            "firstInhibitorAssist": false,
            "inhibitorKills": 0,
            "towerKills": 4,
            "wardsPlaced": 2,
            "wardsKilled": 0,
            "largestMultiKill": 2,
            "killingSprees": 1,
            "totalUnitsHealed": 1,
            "totalTimeCrowdControlDealt": 98
        },
        "participantId": 1,
        "runes": []
    },
   ... (9 more like that)
],
"participantIdentities": [],
"teams": [
    {
        "teamId": 100,
        "winner": false,
        "firstBlood": true,
        "firstTower": false,
        "firstInhibitor": true,
        "firstBaron": false,
        "firstDragon": true,
        "towerKills": 6,
        "inhibitorKills": 2,
        "baronKills": 0,
        "dragonKills": 3,
        "vilemawKills": 0,
        "dominionVictoryScore": 0,
        "bans": [
            {
                "championId": 120,
                "pickTurn": 1
            },
            {
                "championId": 37,
                "pickTurn": 3
            },
            {
                "championId": 13,
                "pickTurn": 5
            }
        ]
    },
    {
        "teamId": 200,
        "winner": true,
        "firstBlood": false,
        "firstTower": true,
        "firstInhibitor": false,
        "firstBaron": false,
        "firstDragon": false,
        "towerKills": 11,
        "inhibitorKills": 4,
        "baronKills": 0,
        "dragonKills": 0,
        "vilemawKills": 0,
        "dominionVictoryScore": 0,
        "bans": [
            {
                "championId": 28,
                "pickTurn": 2
            },
            {
                "championId": 38,
                "pickTurn": 4
            },
            {
                "championId": 63,
                "pickTurn": 6
            }
        ]
    }
]
}

预期产出:

{ 
_id: { championId: Number, day: Number }
value: { banned: Number, firstBanned: Number }
}

之后,它应该与之前的MapReduce操作的结果合并,使用相同的键复制文档的所有字段(在reduce函数中),但是现在因为错误发生在...之前不相关...

0 个答案:

没有答案