2016-11-26 8 views
0

私は「フィルタリング」システムを構築しており、生年月日が2日のコレクションのユーザーを照会する必要があります。 (エラーなし)空の配列が返されるMongoDBでプレーンテキストと書式YYYY-MM-DDとして保存されている日付を照会

if (req.query.ageMin) { 
    var dobMin = new Date(dateNow.setFullYear(dateNow.getFullYear() - req.query.ageMin)); 
} 
if (req.query.ageMax) { 
    var dobMax = dateNow.setFullYear(dateNow.getFullYear() - req.query.ageMax); 
} 

if (dobMin && dobMax) { 
    query.dob = { 
    $gte: dobMin, 
    $lt: dobMax 
    } 
} else if (dobMin) { 
    query.dob = { 
    $gte: dobMin 
    } 
} else if (dobMax) { 
    query.dob = { 
    $lt: dobMax 
    } 
} 

db.users.find(query).toArray(function (err, users) { 
    console.log(users); 
}); 

私が今持っているコードは次のようになります。 コレクション内の日付が日付オブジェクトではないことが前提です。それらは単に "1980-06-15"のような文字列です。 クエリに渡すことができるオプションはありますか?Mongoはクエリを実行するときに、保存された日付に日付オブジェクトを作成させますか?またはそのことについては、解決策...

+0

* dateNow *あなたは 'dateNow.setFullYear(...)を行うときに'あなたは、プレーンなJS日付である場合* dateNow *の値を変更します。したがって、2016年に18と20の間の人を探しているならば、* dobMin *は1998年になり、* dobMax *は1978年になります。* setFullYear *はDateではなく時間値を返します。* dobMax *一方、* dobMin *は日付です。比較演算子を使用した比較は、日付を強制的に数字に変換するために機能します。 – RobG

+0

良いキャッチは、実際にそれをキャッチし、同様にdobMaxに新しいDate()関数を追加しました。情報をありがとう。 –

答えて

1

は、文字列に日付のインスタンスを変換してみてください。

dobMin = dobMin.toISOString().substring(0, 10) 
dobMax = dobMax.toISOString().substring(0, 10) 
+0

ありがとう、私は実際に 'dobMax = dobMax.toISOString()。split( 'T')[0];' –

+1

を実行することによって同様に解決しました。 'new Date(dateNow.setFullYear(dateNow.getFullYear() - req.query .ageMin)) 'はホストタイムゾーンオフセットを使用しますが、* toISOString *はUTCを使用します。ホストのタイムゾーンが+00:00以上で、タイムゾーンが-00:15以上の場合(たとえば北米と南米のすべて)、日付は前日となります。 – RobG

関連する問題