2013-03-19 27 views
2

我有下面的文档保存在MongoDB的收藏。它们按升序排序。我只想在指定的时间间隔内获得一个文档。 (我使用node-jong和node-mongodb驱动程序。)我应该如何实现它?如何支持时间段找到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

号他们是不同的问题。 – Jeffrey 2013-03-19 09:08:55

+0

地图/减少是你在找什么。 – freakish 2013-03-19 09:17:46

+0

@Freakish,你能给一个链接去描述细节吗? – Jeffrey 2013-03-19 09:20:37

回答

4

的Map/Reduce是你在找什么。

想想您的收藏这样的:你有文件,其中created_at变得ID。或者我应该说最多一分钟的created_at的一部分。因此,例如,该功能将被用来确定ID:

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

所以这个功能日期对象转换为包括年,月,日,小时和分钟的字符串。我们不在乎秒,因为每分钟只需要一个对象。

现在你必须定义地图和减少功能。例如地图可以看起来像:

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

,并减少:

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

在这里,我们只是回到我们的第一个值(与排序会给你想要的东西相结合)。请注意,这是每个关键,所以我们很好。

现在你要开枪蒙戈侧这项工作。根据您的驱动程序也可能是这样的:

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/

相关问题