MongoDBで、日付の期間を指定して検索する方法

MongoDBで日付情報を保存するときは、MongoDB標準のISODateで保存することが多いと思います。

ISODateで日付期間指定して検索する方法を紹介します。

例:2011-11-01から2011-11-02の期間を指定して検索する

RDBMSの場合
SELECT * FROM userlog WHERE timestamp BETWEEN '2011-11-01' AND '2011-11-02' ORDER BY timestamp;
Mongo Shellの場合
var query  = { "timestamp" : { "$gte" : ISODate("2011-11-01T00:00:00+09:00"), "$lte" : ISODate("2011-11-02T00:00:00+09:00") } };
db.userlog.find(query).sort({timestamp:1});

境界値を含みたくない場合は、"$gt","$lt"と書きます。
var query  = { "timestamp" : { "$gt" : ISODate("2011-11-01T00:00:00+09:00"), "$lt" : ISODate("2011-11-02T00:00:00+09:00") } };

ISODateを使うときのポイント
ISODate("2011-11-01T00:00:00+09:00")
のように末尾に"+09:00"と書くことです。
これにより、入力する日時が日本標準時として解釈されます。

短く書きたいなら下記のようにも書けます。
こちらはあまり直感的ではありませんね。
ISODate("2011-11-01T00+09")

ラッパ関数を作る

上記のようなテクニックをいちいち覚えておくのも面倒くさいので、
下記のようなラッパ関数を作っておくのがよいでしょう。

> var JSTDate = function(str) { return ISODate(str + 'T00+09:00'); }
> JSTDate('2011-11-01');
ISODate("2011-10-31T15:00:00Z")

> var query  = { "timestamp" : { "$gte" : JSTDate("2011-11-01"), "$lte" : JSTDate("2011-11-02") } };
> db.userlog.find(query).count();
カテゴリ: