2017-03-29 6 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の日付の値を比較するために、等価演算子(例えば=====!=!==)を使用することはできません。 javascript comparison operators reference docs ...

オブジェクトを比較する式は、オペランドが同じオブジェクトを参照する場合にのみ真です。

代わりに.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が何らかのリマインダを設定したいと思っていて、それに対する否定的な道を選ぶと思います。 2. 'moment.js'は他のライブラリと同様に、Meteorの最近のバージョンでもnpm経由でインストール可能です。 – MasterAM

+0

これは、平等に関しては真です。私はOPコードに直接結びつける例としてしか示していませんでした。あなたはMeteorのnpmについても正しいです。私はそれを更新します。 – jordanwillis

関連する問題