0

どういうわけか、mongod-native は、挿入されたオブジェクトの連続したオブジェクト ID を作成します。データベースがこの仕事を行うことができるか、mongodb-native が少なくとも db と同じ生成戦略を使用できれば、私はそれを好むでしょう。

mongodb ネイティブで挿入すると、次のようになります。

"_id" : ObjectId("520cc99c00bd49c20180aad0")
"_id" : ObjectId("520cc99c00bd49c20180aad1")
"_id" : ObjectId("520cc99c00bd49c20180aad2")

シェルを使用して同じコレクションに挿入すると、実際の ID が生成されます。

"_id" : ObjectId("520cc9f25aea0256082427e9")

これは何が原因ですか?これはレプリケーション/シャーディングにとって大きな問題ではありませんか?

ところで。私は使用しています

db: {
    forceServerObjectId: true
}

ノード内のオブジェクトに_idが設定されていないという唯一の効果があります...

4

2 に答える 2

2

まず、次のバイトを見てくださいObjectId

ObjectId is a 12-byte BSON type, constructed using:

a 4-byte value representing the seconds since the Unix epoch,
a 3-byte machine identifier,
a 2-byte process id, and
a 3-byte counter, starting with a random value.

したがって、ObjectId単一のマシンで一連の をすばやく作成する_idと、3 バイトのカウンター (タイムスタンプ、プロセス ID、およびマシン識別子はすべて同じになります)。

ほとんどの MongoDB ドライバー/クライアント_idは、データベース サーバーではなく、既定でローカルに を作成します (これらはすべてオープン ソースであるため、各実装を調べて、 がどのように_id生成されるかの詳細を確認できます。これには少し掘り下げる必要があります (たとえば、NodeJS の例を次に示します)

シェルから生成された は、クライアントから生成された_idより「本物」ではありません。_idシード値が異なるだけです (もちろん、マシン ID とプロセス ID は異なります)。

シャーディングにを使用するObjectIdと、2.4 以降では、範囲とハッシュの 2 つの選択肢があります。それぞれに長所と短所があり、最終的には、必要な書き込み、読み取り、クエリなどの性質に応じて、どちらも非常にうまく機能します。詳細については、こちらをご覧ください。

于 2013-08-15T13:57:03.890 に答える
0

連続するオブジェクト ID に問題がある場合は、カスタム オブジェクト ID とランダム オブジェクト ID を作成することもできます

_id フィールドは常にインデックス化され、主キーであるため、オブジェクトごとに異なる objectid が生成されるようにする必要があります。ユーザー定義のオブジェクト ID を最適化するためのガイドラインがいくつかあります。

http://docs.mongodb.org/manual/core/document/#record-documents

http://docs.mongodb.org/manual/reference/object-id/

于 2013-08-15T12:45:51.990 に答える