8

マルチプロセス環境で MongoDB を使用していますが、挿入順序でクエリを並べ替えて、特定のドキュメントの後に挿入されたドキュメントに制限する方法を知りたいと思っていました。単一のプロセスで ObjectID を使用できますが、そうしないと、同じ秒内に異なるプロセスからの 2 つの ObjectId の順序が間違っている可能性があります。

例:

ObjectId("5236dc5c 88ee6f 2075 bd0049")

直前のプロセス 2075 によって生成された可能性があります

 ObjectId("5236dc5c 88ee6f 2071 f35fb8")

両方の ID のタイムスタンプ部分が等しい (5236dc5c) ことに注意してください。このタイムスタンプは秒単位で与えられます。

4

2 に答える 2

11

ObjectIds または日付フィールドを使用してソートすると、探している結果が得られない場合があります。挿入されたドキュメントの ObjectId と日付はクライアント側で生成されるため、複数のマシンからの接続で実行している場合、マシン間のタイミングが完璧でない限り、順序の不一致が発生します。

あなたがやろうとしていることの詳細を教えていただけますか? 特定のドキュメントの後にドキュメントのリストを挿入する必要がある理由に応じて、MongoDB から必要な動作を取得する方法がいくつかあります。

たとえば、ドキュメントの順序付けられたリストを一種のキューとして使用しようとしている場合は、代わりにfindAndModifyコマンドを使用して未読ドキュメントをフェッチし、「既読」フィールドをアトミ​​ックに更新して、2 回読まないようにすることができます。 . findAndModify を呼び出すたびに、読み取りフィールドが true に設定されていない最新のドキュメントがコレクション内で検索され、そのフィールドがアトミックに true に設定され、処理のためにドキュメントがクライアントに返されます。

一方、ユースケースで挿入された順序でドキュメントのリストが本当に必要な場合は、挿入されたドキュメントの自然な順序を利用できます。MongoDB では、ドキュメント サイズの変更や削除によって移動が必要になる場合を除き、ドキュメントは挿入順にディスクに書き込まれます。自然な順序を維持することが保証されているキャップ付きコレクションを使用することで、これを利用してドキュメントのリストを簡単に取得できます。キャップ付きコレクションの使用にはいくつかの主要な制限があることに注意してください。これについては、 ドキュメントで詳しく説明されています。

于 2013-09-16T14:50:57.037 に答える