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

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();
カテゴリ: