2014-09-24 1 views
0

현재 Mongoose를 Node.js 및 MongoDb와 함께 사용하여 특정 문제를 파악하려고합니다. 내 mongodb 계획 모음에 계획 날짜가 세 개의 다른 필드 (연도 저장, 월 저장, 날짜 저장 중 하나)로 분할 된 레코드가 있습니다. 예를 들어, 날짜 2014년 7월 4일은과 같이 저장됩니다 : 나는 나에게 지정된 시작 및 종료 날짜 범위 사이에 존재하는 모든 계획 레코드를 반환하는 몽구스 쿼리를 구성하려고중첩 된 Or 's/And가있는 몽구스 복합 쿼리

_id: fjewifjweifja... 
Name: "test plan name" 
PlanDateYear: 2014 
PlanDateMonth: 7 
PlanDateDay: 4 

. 모든 계획 날짜가 같은 해에 발생하면 시작 날짜와 종료 날짜 범위 사이에서 계획을 가져 오기 위해 쿼리가 작동하지만 일부 계획 날짜가 다른 연도로 넘어가면 mongoose 쿼리 논리가 모두 엉망이됩니다. 계획 컬렉션에 필드가있는 제약 조건 (PlanDateYear, PlanDateMonth 및 PlanDateDay) 내에서이 작업을 수행하는 간결한 방법이 있습니까?

도움을 주셔서 감사합니다. 나는 잠시 지금이 붙어 있었어요 :(

여기 내 현재 쿼리 : 나는 몽고는 날짜와 함께 작동, 또는 간단한 이후 날짜 (YYYYMMDD)를 나타내는 정수를 사용하는 방법을 찾을 것

Plan.find({ 
        'user': req.user.id, 
        "$or" : [ 
         { 
          'planDateMonth': startDateMonth, 
          "$and" : [ 
           { "planDateDay" : {$gte: startDateDay} } 
           ,{'planDateMonth': {$ne: endDateMonth}} 
           //,{'planDateYear': {$gte: startDateYear}} 

          ] 
         }, 
         { 
          'planDateMonth': endDateMonth, 
          "$and" : [ 
           { "planDateDay" : {$lte: endDateDay} } 
           ,{'planDateMonth': {$ne: startDateMonth}} 

          ] 
         }, 
         { 
          'planDateMonth': {$ne: endDateMonth}, 
          "$and" : [ 
           {'planDateMonth': {$ne: startDateMonth}}, 
           {'planDateMonth': {$lte: endDateMonth, $gte: startDateMonth}}, 
           {'planDateDay': {$lte: endDateDay, $gte: startDateDay}} 

          ] 
         }, 
         { 
          'planDateMonth': endDateMonth, 
          "$and" : [ 
           {'planDateMonth': startDateMonth}, 
           {'planDateDay': {$lte: endDateDay, $gte: startDateDay}} 

          ] 
         } 
        ] 
       } 
      ) 
       .exec(function (err, plans) { 
       if (err) return next(err); 

       else { 
     //do stuff 
    } 
+0

이러한 데이터가 날짜로 저장되지 않은 이유는 무엇입니까? –

+0

솔직히 말해서 저는 UTC로 저장된 경우에도 자바 스크립트 날짜를 저장하는 데 많은 어려움을 겪고있었습니다. 특정 날이되어야한다는 것은 내 웹 사이트가 호스팅되는 원격 서버 위치에 따라 이전 또는 다음 날로 끝날 것입니다 (heroku를 사용하면 웹을 볼 수 있습니다 ite는 먼 시간대의 서버였습니다). DB에서 특정 날짜를 가져올 때 연, 달, 일을 별도의 필드 및 int로 저장 한 다음 해당 필드에 대한 비교를 수행했을 때만 서버에서 일관된 날짜를 얻을 수있었습니다. – jre247

+0

해결 방법이 있습니다. 비교 목적으로 모든 날짜를 UTC로 저장하는 경향이 있습니다. YYYYMMDD로 날짜를 저장하는 것도 가능하며 여전히 간단한 비교가 가능합니다. 기본적으로 분리 된 1 년 월과 일은 질의하기가 가장 어려울 것입니다. –

답변

0

수학적 비교가 예상대로 작동합니다.

+0

도움을 주셔서 대단히 감사드립니다! – jre247