从mongodb集合中查找文档时如何支持时间间隔?

时间:2013-03-19 08:47:43

标签: node.js mongodb node-mongodb-native

我将以下文档保存在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"}

谢谢,

杰弗里

1 个答案:

答案 0 :(得分:4)

Map / Reduce正是您所寻找的。

考虑一下你的收藏:你有created_at成为身份证的文件。或者我应该说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/