我将以下文档保存在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"}
谢谢,
杰弗里
答案 0 :(得分:4)
Map / Reduce正是您所寻找的。 p>
考虑一下你的收藏:你有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概述: