MongoDB の ObjectID は挿入日時の情報が含まれているので、日時で範囲検索できる。
ObjectID の構成は以下のサイトが詳しい。
「MongoDB の ObjectID の生成規則(構成)」
目次
(1) ObjectID の日時を表示する
1 2 |
> db.Test.find({},{'_id':1}).sort({_id:-1}).forEach(function(n) { print(n._id.getTimestamp()) }); Thu Jul 06 2017 17:02:45 GMT+0900 (東京 (標準時)) |
(2) ObjectID の日時を取得する
ObjectID の先頭4byteから日時を取得できる。
1 2 3 4 |
> obj = new ObjectId() ObjectId("4faf45d47f8e775a2d1a6948") > createdDt = new Date(parseInt(obj.toString().substr(0, 8), 16) * 1000) ISODate("2012-05-13T05:25:40Z") |
(3) ObjectID から日時で範囲検索
(3-1) 過去10日以前のデータを検索
1 |
> db.hoka.find({_id:{$lte: ObjectId(Math.floor((new Date() - 9*24*60*60*1000)/1000).toString(16) + "0000000000000000")}}) |
(3-2) 過去10日以前のデータを削除
1 |
> db.hoka.remove({_id:{$lte: ObjectId(Math.floor((new Date() - 9*24*60*60*1000)/1000).toString(16) + "0000000000000000")}}) |
(3-3) 指定日時より後のデータを検索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function objectIdWithTimestamp(timestamp) { // Convert string date to Date object (otherwise assume timestamp is a date) if (typeof(timestamp) == 'string') { timestamp = new Date(timestamp); } // Convert date object to hex seconds since Unix epoch var hexSeconds = Math.floor(timestamp/1000).toString(16); // Create an ObjectId with that hex timestamp var constructedObjectId = ObjectId(hexSeconds + "0000000000000000"); return constructedObjectId } // Find all documents created after midnight on May 25th, 1980 db.mycollection.find({ _id: { $gt: objectIdWithTimestamp('1980/05/25') } }); |
このサイトからピックアップ。
とか
1 |
db.hoka.find({_id:{$gt: ObjectId(Math.floor((new Date('2015/1/12'))/1000).toString(16) + "0000000000000000")}}).pretty() |
以上