1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MongoDBのObjectIdだけで、日付で範囲指定して取得する方法

Posted at

たまには、MongoDBネタで。

MongoDBのObjectIdの生成規則


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とか使って普通に全部再起動になるとかなのかなぁとか。技術は進歩してますね。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?