2016-12-03 9 views
0

나는 meteorhacks을 사용하고 지금Meteor MongoDB : 콜렉션 필드에서 계산 된 종료일을 사용하여 날짜 범위를 집계하는 방법은 무엇입니까? 유성 집계 패키지를, 나는 사이의 날짜 범위 내에서 이벤트 찾으려고 노력 해요 : :

  • , 마이너스 하루.
  • 이벤트 종료일과 2 주.

문제는 끝 날짜가 이벤트 문서의 times.until 필드에 저장됩니다. 이벤트 문서는 다음과 같습니다

// Event collection doc: 
{ 
    _id: 'abc', 
    times: { 
    start: { 
     dateTime: "ISODate("2017-03-07T00:00:00Z"), 
     timeZone : "America/Chicago" 
    }, 
    until: "20170307T000000Z" 
    } 
} 

내가 할 수 범위의 날짜를 찾을 수 집계,하지만 난 이벤트의 times.until 필드를 기준으로 범위의 끝 날짜를 계산하는 방법을 알아낼 수 없습니다.

if (Meteor.isServer) { 
    Meteor.methods({ 
    'events.inProgress'() { 
     const start = moment().utc().subtract(1, 'day').toDate(); 

     return Events.aggregate([ 
     {$match: {"times.start.dateTime": {$gt: start, $lt: end**(MUST COMPUTE end FROM DOC'S times.until PLUS 2 WEEKS)**}}}, 
     ]); 
    } 
    } 
} 

또한, times.until 필드의 형식을 참고하는 것은 (이 형식의 올바른 이름 확실하지) 20170307T000000Z입니다. 이것은 JavaScript Date의 유효한 형식은 아니지만 moment.js는이 문자열을 아무 문제없이 처리합니다. times.until 필드에 접근 할 수있는, 내가 할 수있는 :

const end = moment(event.times.until).add(2, 'week').toDate(); 

이 나에게 범위의 올바른 종료 날짜를주지 않지만, 파이프 라인을 구축 할 경우에 어떻게 최종 날짜를 계산하기 위해 times.until 필드를 잡아 수 있습니까?

+0

집계를 수행하기 전에'times.until'을 유효한 날짜 개체로 업데이트 할 수 있습니까? 왜냐하면 파이프 라인에'times.until'과 함께 새로운 날짜 객체를 만드는 것은 거의 불가능하기 때문입니다. – Khang

+0

@Khang 예, mongo에 저장되기 전에 랩핑 할 수 있습니다. until (until) .toDate()를 사용합니다. – asking

+1

그 다음에는해야할 일이며'until' 필드의 형식은 https://en.wikipedia.org/wiki/ISO_8601 – Khang

답변

1

사용 $add 원하는 날짜를 얻을 수 밀리 초를 추가합니다. 당연히 이것은 시대를 의미합니다. 은 mongo 날짜 유형입니다.

aggregate([{ 
    $match: { 
     "times.start.dateTime": { 
      $gt: start, 
      $lt: { 
       $add: ["$times.until", 14 * 24 * 60 * 60000] 
      } 
     } 
    } 
}]) 
+0

입니다. 이것이 작동하지 않을 것이라고 생각하면 'until'필드가 문자열 – Khang

+2

그래, 그 대답에 언급 한 이유가 날짜 일 것이다 – Veeram

+0

실례합니다. @Khang, 나는 잘못 알고 있습니다. 실제로 원했던 것은 (' "times.until"'+ 2 weeks)''now'보다 큽니다. 이벤트 2 주 연장. @Veeram이 게시 한'$ add' 솔루션을 사용하여 계산 된 날짜를 만들기 위해'$ project'를 사용하여 그것을 해결했습니다. 계산 된 날짜는'$ match'로 전달되어'now'와 비교할 수 있습니다. '$ redact'로이 일을하는 데 더 효율적인 방법이 있습니다. 나는 그것을 알아 내려고 노력할 것이다. – asking