10
> db.events.find()
{ "_id" : ObjectId("50911c3e09913b2c643f1215"), "context" : "jvc8irfjc9cdnf93", "key" : "value" }
{ "_id" : ObjectId("50911c4709913b2c643f1216"), "context" : "jvc8irfjc9cdnf93", "key" : "new value" }
{ "_id" : ObjectId("50911c4b09913b2c643f1217"), "context" : "jvc8irfjc9cdnf93", "key" : "newer value" }
{ "_id" : ObjectId("50911c4f09913b2c643f1218"), "context" : "jvc8irfjc9cdnf93", "key" : "newest value" }
{ "_id" : ObjectId("50911c6309913b2c643f1219"), "context" : "0djd8vcndkfnjhv3", "key" : "value" }

Mongo DB サーバー上のイベントのリストです。クライアントは、たとえば 2 番目のイベントなど、自分が知っている最後のイベントを追跡します50911c4709913b2c643f1216

この既知のイベントの後に挿入されたすべてのイベントを取得するにはどうすればよいですか? この場合50911c4b09913b2c643f121750911c4f09913b2c643f121850911c6309913b2c643f1219.

4

4 に答える 4

10

ObjectIdデフォルトではaincとa timestamphttp://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification )が含まれているため、実際にを使用しObjectIdて挿入時間を(大まかに)理解できます。

db.col.find({_id: {$gt: {ObjectId("50911c4709913b2c643f1216")}}});

ただし、特にアプリで挿入前にしばらく作成し、後で作成されたことがわかっている1つのレコードが実際に(そのために)以前と同じように表示さObjectIdれる場合は、常に非常に信頼できるとは限りません。ObjectId_id

ObjectIdfor挿入タイマーを信頼できない特定のシナリオでの挿入の場合ts、BSON日付タイプ(ISODate)のフィールドを追加し、2つのクエリを使用してその範囲を指定できます。1つは元のドキュメントの時刻を取得し、もう1つは後にすべてのドキュメントを取得します。

個人的には、BSON日付型を使用する2番目の方法を選択することを好みます。これは、信頼性と柔軟性が高いためです。

于 2012-10-31T13:32:47.803 に答える
2

ここでオブジェクト ID が昇順で表示されている理由は、それ time|machine|pid|incObjectId.

にはすでに時間コンポーネントがあることに注意してくださいObjectId。ただし、それは秒単位です。
MongoのDate型は、エポックからのミリ秒数の表現です。これにより、挿入時間を把握するための精度が向上します。

ミリ秒を超える絶対精度が必要な場合は、シーケンス番号の形式でカウンターを使用するのが最善の方法だと思いますが、アプリの書き込みがそれほど集中していないと思われる場合は、日付型を追加のキーの形式で使用するだけですタイムスタンプ。

于 2012-10-31T13:48:27.530 に答える
1

サンプルでは、​​「組み込み」の ObjectID を使用しています。順次ではなく、一意になるようにします。タイムスタンプを追加したり、公式ドキュメントが提案するようにシーケンス番号を使用したり、その属性に基づいてクエリを実行したりできます。

この新しい属性を追加したら、2 つのクエリを実行する必要があります。クライアントが指定した ID に対応する連続番号またはタイムスタンプを取得するための 1 つと、その後に挿入される項目を取得するための別のクエリです。

于 2012-10-31T12:58:04.200 に答える
0

ObjectID は他の人が既に述べたように時間に基づいているため、クエリ用に独自の時間ベースの ObjectID を構築できます。これにより、インデックス作成スペースを節約できます:)

Javascript での実装については、https://stackoverflow.com/a/8753670/1008449を参照してください。

于 2013-11-09T11:18:45.443 に答える