2017-03-29 10 views
0

커서에서 생성 된 날짜에 setDate() 함수를 사용하려면 어떻게해야합니까? 커서에서 생성 된 날짜에 setDate() 함수를 사용하려면 어떻게해야합니까?

내가 올바르게 유효 기간과 유효 기간 자체 전에 어느 날 사이의 값으로 커서를 반환하는 쿼리를 생성하기 위해 노력하고 있어요. 내 코드 아래

찾기 : 위의 코드에서

var currentDate = new Date(); 
var expiryDate;  
var dayBeforeExpiry; 

var loopThruCollection = buyList.find({}); 

loopThruCollection.forEach(function (row) { 
     console.log (row.expiryDate)  
     expiryDate = row.expiryDate;    
}); 

// expiryDate minus one day, should equal the day before the expiry date. 
dayBeforeExpiry = expiryDate.setDate(expiryDate.getDate() -1); 

if(currentDate == dayBeforeExpiry){ 
     return buyList.find({ expiryDate : {'$gte': dayBeforeExpiry, '$lte': expiryDate } }).fetch(); 

     }  

else { 
     return buyList.find({ expiryDate : {'$lte': expiryDate}}).fetch(); 
     }  

결과는 다음과 같습니다

Thu Mar 30 2017 16:29:35 GMT+0300 (EAT) 
2017-02-22T14:46:33+03:00 
2017-03-21T17:17:22+03:00 
2017-03-21T17:18:45+03:00 
2017-01-30T17:42:21+03:00 
2017-02-22T15:10:50+03:00 
2017-01-27T21:45:57+03:00 

Uncaught TypeError: expiryDate.getDate is not a function(…) 

나는 내가 expiryDate에서 변수 전날를 생성 대해 이동하는 방법을 모르겠습니다.

정정을 부탁드립니다.

답변

2

출력 결과에 따르면 expiryDate 필드가 모두 ISODate (실제로는 다르게 출력되기 때문에)으로 저장되는 것은 아닙니다. ISODate으로 저장되지 않은 경우 Meteor의 Date 개체에 자동으로 매핑되지 않습니다. 이로 인해 대부분 .getDate is not a function(…) 오류가 발생하는 것 같습니다.

mongodb을 직접 쿼리하고 필드에 저장된 값을 보면이를 확인할 수 있습니다. 일부 문자열이 문자열로 저장되어 있는지 확인하고 ISODate과 비교하십시오. 일부는 문자열이고 일부는 ISODate입니다.

또한, 평등 연산자를 사용할 수 없습니다 실제로 객체 자체 (안 자신의 값)을 비교하기 때문에 (예를 들어 ==는, ===, !=, !==가), 자바 스크립트 날짜의 값을 비교하고 항상 false 될 것입니다. javascript comparison operators reference docs ...

피연산자를 비교하는 표현식은 피연산자가 동일한 Object를 참조하는 경우에만 true입니다.

대신 .getTime() 방법을 사용하여 날짜 값을 비교해야합니다.

// won't work...will always return false 
if (currentDate == dayBeforeExpiry) { 
    // do stuff 
} 

// correct way 
if (currentDate.getTime() == dayBeforeExpiry.getTime()) { 
    // do stuff 
} 

그러나 비교가 밀리 초 이하이기 때문에 원하는 작업을 수행하지 못할 수도 있습니다. 논리를 변경하고 년, 월, 일만 비교하고 시간을 모두 제외하는 것이 더 합리적 일 수 있습니다.

그런 말로는 유성 앱에 moment.js을 사용하여 모든 날짜 논리를 처리하는 것이 좋습니다. 단위 시간을 더하거나 뺄 수있는 함수를 내장하고 있습니다. 나는 내 애플 리케이션에서 날짜를 많이 다루고 있으며, 그것을 생명의 은인으로 사용하고있다.

npm (meteor npm install moment --save) 또는 유성기 패키지 (meteor add momentjs:moment)를 통해 유성 앱에 설치할 수 있습니다.

+0

몇 가지주의 사항 : 1. 평등성 (또는 완전 항등 연산자)을 사용하여 날짜를 비교할 필요가 없을 것입니다. 밀리 초 단위로 놓친 것처럼 시간은 동일하지 않습니다. 나는 OP가 어떤 종류의 알림을 설정하고 그것에 대한 naiive 경로를 선택한다고 생각합니다. 2.'moment.js'뿐만 아니라 다른 라이브러리도 Meteor의 최신 버전에 npm을 통해 설치할 수 있습니다. – MasterAM

+0

그래, 평등에 대해서는 사실입니다. 나는 OP 코드에 직접 묶는 예제로 만 보여주었습니다. Meteor에서도 npm에 대해 정확합니다. 나는 그것을 업데이트 할 것이다. – jordanwillis