sql >> データベース >  >> NoSQL >> MongoDB

重複するMongoObjectIdが2つの異なるコレクションで生成される可能性はありますか?

    簡単な回答

    最初の質問に直接回答を追加するだけです。はい、BSONオブジェクトIDの生成を使用する場合は、ほとんどのドライバーで IDは、ほぼ確実にコレクション全体で一意になります。 「ほぼ確実に」の意味については、以下を参照してください。

    長い答え

    Mongo DBドライバーによって生成されたBSONオブジェクトIDは、コレクション全体で一意である可能性が非常に高くなります。これは主に、IDの最後の3バイトが原因であり、ほとんどのドライバーにとって 静的インクリメントカウンターを介して生成されます。そのカウンターはコレクションに依存しません。それはグローバルです。たとえば、Javaドライバーは、ランダムに初期化された静的なAtomicIntegerを使用します。

    では、なぜ、Mongoのドキュメントで、IDが一意になると完全に言うのではなく、IDが「非常に可能性が高い」と言っているのでしょうか。一意のIDを取得できない場合、3つの可能性があります(さらにある場合はお知らせください):

    この説明の前に、BSONオブジェクトIDは次のもので構成されていることを思い出してください。

    [エポックから4バイト秒、3バイトのマシンハッシュ、2バイトのプロセスID、3バイトのカウンター]

    ここに3つの可能性があるので、あなたは自分でだまされる可能性がどれほどあるかを判断します:

    1)カウンターオーバーフロー:カウンターには3バイトあります。同じマシン上で同じプロセスで1秒間に16,777,216(2 ^ 24)を超えるドキュメントを挿入すると、増分カウンターバイトがオーバーフローし、同じ時間のマシンを共有する2つのオブジェクトIDになってしまう可能性があります。 、プロセス、およびカウンター値。

    2)カウンターの非インクリメント:一部のMongoドライバーは、カウンターバイトの数値をインクリメントする代わりにランダムな数値を使用します。これらの場合、一意でないIDを生成する可能性は1 / 16,777,216ですが、これら2つのIDが同じ秒内(つまり、IDの時間セクションが次の秒に更新される前)に生成された場合に限ります。マシン、同じプロセスで。

    3)ハッシュを同じ値に加工および処理します。マシンIDとプロセスIDの値は、非常にまれなシナリオでは、2つの異なるマシンの同じ値にマップされる場合があります。これが発生し、同時に2つの異なるマシン上の2つのカウンターが同じ秒の間に同じ値を生成すると、IDが重複することになります。

    これらは注意すべき3つのシナリオです。シナリオ1と3はほとんどありそうにないようです。適切なドライバーを使用している場合、シナリオ2は完全に回避できます。確実に知るには、ドライバーのソースを確認する必要があります。



    1. mongodbを組み込みデータベースとして使用できますか?

    2. 値を持つキーをどのように検索しますか?たとえば、値がsomevalueであるすべてのKEYSを取得します

    3. C#用の最も成熟したMongoDBドライバーは何ですか?

    4. MongoDBで10進型を使用する方法