2014/05/05

mongodbで新しいドキュメント取得

やりたいこと
あるコレクションから、
まだ取得していなくて、
新しく追加されたドキュメントを取得したい


例えば、oidが、あるOIDまで取得している状態で、
db.test.find({_id:{$gt:ObjectId(OID)}}).sort({_id:-1});
db.test.find({_id:{$gt:ObjectId(OID)}}).sort({$natural:-1});
などが思い当たりますよね。

ここでOIDは、4つに分けて
536700f5 80bedc 359f 275bc9
the seconds since the Unix epochとmachine identifierとprocess idとcounter
http://docs.mongodb.org/manual/reference/object-id/
らしいから、

これだと秒まで同じドキュメントが複数あって、それらが違うmachine idの場合に対応できないよね。

oidの2つ目のmachine idって

mongo localhost/test1 insert.js
536700f5 80bedc 359f 275bc9

mongo 127.0.0.1/test2 insert.js
536701af dc8c4c 3ebe 80a615

mongoシェルからやったら
53670229 daa151 cae9 41c342

みたいに
同じマシンでもinsertの仕方によっても違うし。

つまり、oidでsortしてもね。

ということで、1秒以内に書き込まれることを考慮したら、
.find({_id:{$gt:ObjectId(OID)}}).sort({_id:-1})では最新を取得できないよね?と思うのですよ。

ということでやっぱり自前のミリ秒くらいまでの時刻フィールド{ts : new Date()}を追加してそれで、
.find({ts:{$gt:timestamp}}).sort({ts:-1})
かつ取ってきたドキュメントでまた持ってないOIDだけに制限して使うことにするわ。


もっといいやり方ないんかね。

0 件のコメント:

コメントを投稿