2013-03-19 61 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/

相關問題