2

我将以下文档保存在 mongodb 集合中。它们按升序排列。我只想在指定的时间间隔内获取一份文档。(我将 node.js 与 node-mongodb 驱动程序一起使用。)我应该如何实现它?

{"created_at":"2013-03-19T07:14:05Z"}
{"created_at":"2013-03-19T07:35:40Z"}
{"created_at":"2013-03-19T07:59:52Z"}
{"created_at":"2013-03-19T08:01:32Z"}
{"created_at":"2013-03-19T08:02:40Z"}
{"created_at":"2013-03-19T08:02:56Z"}
{"created_at":"2013-03-19T08:06:24Z"}
{"created_at":"2013-03-19T08:07:08Z"}
{"created_at":"2013-03-19T08:23:27Z"}
{"created_at":"2013-03-19T08:27:44Z"}
{"created_at":"2013-03-19T08:27:58Z"}
{"created_at":"2013-03-19T08:28:04Z"}
{"created_at":"2013-03-19T08:28:08Z"}
{"created_at":"2013-03-19T08:28:23Z"}

例如,如果时间间隔为 1 分钟,则预期结果如下。

{"created_at":"2013-03-19T07:14:05Z"}
{"created_at":"2013-03-19T07:35:40Z"}
{"created_at":"2013-03-19T07:59:52Z"}
{"created_at":"2013-03-19T08:01:32Z"}
{"created_at":"2013-03-19T08:02:40Z"}
{"created_at":"2013-03-19T08:06:24Z"}
{"created_at":"2013-03-19T08:07:08Z"}
{"created_at":"2013-03-19T08:23:27Z"}
{"created_at":"2013-03-19T08:27:44Z"}
{"created_at":"2013-03-19T08:28:04Z"}

以下文件不应退回。

{"created_at":"2013-03-19T08:02:56Z"}
{"created_at":"2013-03-19T08:27:58Z"}
{"created_at":"2013-03-19T08:28:08Z"}
{"created_at":"2013-03-19T08:28:23Z"}

谢谢,

杰弗里

4

1 回答 1

4

Map/Reduce 是您正在寻找的。

像这样考虑你的收藏:你有文件created_at成为 ID。或者我应该说created_at最多一分钟。因此,例如,此函数将用于确定 ID:

var GenerateID = function(date) {
    return date.getFullYear() + "/" +
           date.getMonth() + "/" +
           date.getDate() + "." +
           date.getHours() + ":" +
           date.getMinutes();
};

所以这个函数将日期对象转换为一个字符串,包括年、月、日、小时和分钟。我们不关心秒数,因为您每分钟只需要一个对象。

现在您必须定义 map 和 reduce 函数。例如地图可能看起来像这样:

var map = function() {
    var key = GenerateID(this.created_at);
    emit(key, this);
};

并减少:

var reduce = function(key, values) {
    if (values.length) {
        return values[0];
    }
};

在这里,我们只返回我们拥有的第一个值(结合排序会给你你想要的)。请注意,这是每个键,所以我们很好。

现在你必须在 Mongo 方面解雇这项工作。根据您的驱动程序,它可能如下所示:

db.collection.mapReduce(
    map,
    reduce,
    {
        out: { inline: 1 },
        query: // your range query
        sort: // by created_at
        scope: { GenerateID: GenerateID },
    }
)

这是官方 MongoDB 的 map/reduce 概述:

http://docs.mongodb.org/manual/applications/map-reduce/

于 2013-03-19T09:45:50.047 回答