私はMongoDBコレクションに文書を連続的に挿入するアプリケーションを持っています。MongoDB - 挿入反映フィールド
私は、挿入命令の後にドキュメントを照会する方法を探しています。
私が使用していた候補者:
_id
フィールド- 作成日付フィールド
- シーケンス番号(自動インクリメント)
_id
フィールドが良くありません候補者が言うように。作成日フィールドは良い候補であった可能性がありますが、クロックが同期していない可能性があるため、注文が破損する可能性があります。順序番号に関して、文書は2つのアプローチを提案します:カウンタと楽観的ループ。カウンターアプローチは、であっても、別の文書D2
の後に文書D1
が挿入される可能性があるため、挿入順序を保証しません。たとえば、D1
がシーケンス番号5を占有し、次にD2
がシーケンス番号6を捕捉した場合、D2
が挿入され、次にD1
が挿入されます。重い挿入環境の場合、楽観的なループアプローチは狂っています。
別の方法がありますか?
EDIT:
カウンタを使用したアプローチには問題があります。以下のシナリオを考えてみましょう。私は継続的に文書をコレクションに挿入するアプリケーションA
を持っています。また、同じコレクションの文書を連続的にポーリングする別のアプリケーションB
もあります。アプリケーションA
はマルチスレッドです。 T1
とT2
の2つのスレッドはそれぞれ文書D1
とD2
を挿入しようとしています。挿入の途中で、アプリケーションB
はさらに多くのドキュメントを要求します。操作の次の順序を想定します
- スレッド
A-T1
は、次のシーケンス番号N
- スレッド
A-T2
は、次のシーケンス番号N+1
- スレッド
A-T2
挿入D2
- アプリケーション
B
は(最後の仮定seq >= N
との文書を要求押収押収処理された文書の番号はN-1
)、D2
(D1
は - スレッドに)まだ
A-T1
挿入D1
- アプリケーションを挿入途中
B
は、最後に処理された文書は、配列番号N+1
)この場合
を持っているので、D1
は処理されません(seq >= N+2
との文書を要求します。
私が正しく理解していれば、どのような順序で文書を作成し、保存したかを知る方法が必要です。自分で_idを生成することをお勧めします。たとえば、サーバーが起動すると、最後の_idが挿入されます(または最大のものが1505と同様)。その後、各文書のistert増加カウンターの上にだけ。そして、あなたは行くのが良いです。保存に失敗したドキュメントがあっても、それをいくつかのJSONファイルに保存して後で再保存することができます。 _idはその時までに生成され、あなたは注文システムを持っています。お役に立てれば。 –
あなたのアプローチが質問の第3のアプローチとどのように違うかはわかりません。 –
これはちょっとだけ言葉が同じです。 –