1

我在我的项目中使用了一些不同的 Map/Reduces 函数。但其中一个与其他有很大不同,因为它需要地图功能中的循环。对于循环中的每个计数,我发送一个发射。

我所拥有的是这种情况(在用户集合中):

 "channels" : [
        "Channel 1",
        "Channel 2",
    ],

我想做的是统计每个频道有多少用户。因此,我可以使用db.users.find({channels: "Channel 1"}).count()但不幸的是频道是动态的,这意味着我不知道所有可能的频道名称,并且将来可能会发生变化。

所以我认为 Map/Reduce 工作会非常完美。但问题是我写的第一个 Reduce 作业计算错误。而另一个我为每个发射使用查询的地方,将永远花费(在 ssh 会话关闭前 3 个多小时)。

所以现在我被困住了,我需要帮助,最好是我想要一份 Map/Reduce 工作,因为它比一堆实时运行速度慢的查询要好。

这是我写的最新的Map和功能:Reduce

var map = function() {
    if(this.channels) {
            for(var i = 0, imax = this.channels.length; i<imax; i++) {
            emit(this.channels[i], 1);
        }   
    }
}

var reduce = function (key, values) {
    var result = 0;

    values.forEach(function (value) {
        // had this before: result += 1;
        result = db.users.find({'channels' : key}).count();
    });

    return result;
}

我知道 reduce 函数很可怕,但我只是尽力而为。我认为我的逻辑可能看起来错误,但我找不到一个好的解决方案。现在我想在每个页面加载时只做一堆查询,但这会很慢。

请帮忙!:)

4

2 回答 2

1

在您的场景中,reduce 函数应如下所示:

var reduce = function (key, values) {
    var result = 0;

    values.forEach(function (value) {
        result += value;
    });

    return result;
}

让我知道它是否仍然无法正常工作,如果确实如此,请举例说明输入和(不正确的)输出。

于 2012-08-02T08:54:07.617 回答
1

MR有时有点慢。因此,您可能想查看 2.2 附带的新聚合框架(我认为它目前处于发布阶段)。

请参阅:http ://docs.mongodb.org/manual/applications/aggregation/

此外,您可能需要通过使用适当的索引来加快查询速度。或者在用户加入/离开频道时向频道添加用户计数并增加/减少。当然取决于您的应用程序的用例。

于 2012-08-02T09:31:36.693 回答