たまには、MongoDBネタで。
MongoDBのObjectIdの生成規則
こちらの記事が参考になります。
4バイトの,Unixエポックからの経過秒数(Unix時間)
3バイトのマシンID
2バイトのプロセスID
3バイトのカウンタ(開始番号はランダム)
先頭がUnix時間なので、先頭以外のバイトを0で指定すれば、時間で範囲指定ができます。
var startTime = 1480518000;
var endTime = startTime + 86400;
var start = new ObjectId(startTime.toString(16) + '00000000000000');
var end = new ObjectId(endTime.toString(16) + '00000000000000');
db.Hoge.find({_id: {$gte: start, $lt: end}});
// こちらでも可
var start = ObjectID.createFromTime(startTime);
ちなみに、$gteは「Greater Than Equal」。$lt「Less Than」。という意味らしいです。
昔書いたスライド
Node.js×mongo dbで3年間サービス運用してみた話
実は、こちらに書いてあるのですが、なんと画像になっており引っ張るのが面倒だったので、Qiita化してみました。(シンタックスハイライト付けたくて、画像なら行けるじゃんと思って当時書いたのですが、今になってコピペ出来ないということに気づくというね。。。今なら、「Marp」使うかなぁ。)
あ、ちなみに、このスライドの中の
mongod単位で見ると、_idが複数ある状態に。。。
というのは、バグフィックスされているそうです。本当に解決したのか?知りたいのですが、転職しちゃったので調査出来ないんですよねー。dumpしてrestoreするだけで、重複_idがあれば標準出力されるので、ピグチームの誰かやってほしいです。。。
理由は、「Mongosに不要になったコネクションが残ってしまって、そちらに書き込んでしまうことがあったため」みたいです。BlueGreanデプロイメントしていたので、Mongosを定期的に再起動しておけばよかったかなぁと。今だと、Dockerとか使って普通に全部再起動になるとかなのかなぁとか。技術は進歩してますね。