2013-03-19 2 views
2

아래 문서가 mongodb 컬렉션에 저장되어 있습니다. 그들은 오름차순으로 정렬됩니다. 지정된 시간 간격 내에 하나의 문서 만 가져 오려고합니다. (node-mongodb 드라이버와 함께 node.js를 사용하고 있습니다.) 어떻게 구현해야합니까?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

+0

지도/Reduce가 당신이 찾고있는 것입니다. – freakish

+0

@Freakish, 세부 사항을 설명하는 링크를 제공 할 수 있습니까? – Jeffrey

답변

4

지도 축소/당신이 찾고있는 무엇.

그런 컬렉션에 대해 생각해보십시오. 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의의지도입니다/개요를 감소 :

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

관련 문제