2012-12-27 19 views
19

MongoDBは_idにObjectId型を使用します。MongoDBの_id型を整数に変更するのは悪いですか?

_idを整数にすると悪いですか? (this宝石で、もし興味があるなら)

+0

本当に依存しています。ユニークなID(自動インクリメント)なので、idをユニークに保つために必要なメンテナンスのオーバーヘッドのために1つが存在するため、noの引数が1つあります(他のカウンタコレクションをクエリする必要があります)。挿入する前にすべての_idの一意性をチェックする必要があるのと同じように、最終的には挿入速度が遅くなり、長時間のロックが作成されます。 – Sammaye

+0

ええと、このシンプルな機能のためにDB内にたくさんのアクションがありますか? =( –

+0

もちろん、MongoDBにはサーバー側の自動インクリメントIDがないので、ここではhttp://docs.mongodbを作成するために必要なものを見ることができます。org/manual/tutorial/create-an-auto-incrementing-field/infactこれは、MongoDBがこのタイプのIDをサポートしていない理由の1つです。サーバサイド – Sammaye

答えて

20

いいえ、実際にはOjbectIdに組み込まれているので、あなたが何か良いものがあると思うなら、_idフィールドのデフォルト値を何でも変更できます。 。 http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/#auto-increment-counters-collection

マルチスレッドISNを」:ここに示されているよう_idsをインクリメントオートを使用する場合は特に、ObjectId策定デフォルトから離れて移動することを決定する際

しかし、これは大きなしかしで、いくつかの考慮事項がありますそのような大きな問題はfindAndModifyであり、アトミックロックは実際にそれを処理することができますが、最初の問題にヒットしました。 findAndModifyは、最速の機能でも最軽量でもなく、定期的に使用したときに顕著なパフォーマンス低下が見られました。

findAndModifyがなくても、とにかくこれを行うオーバーヘッドも考慮する必要があります。あなたが持っているすべてのインサートについて、追加のクエリを行う必要があります。あなたが挿入したいたびに一意性を問い合わせなければならない一意のIDを持つイメージは、最終的に挿入率がクロールに落ちて、あなたのロックが構築されます。

もちろん、ObjectIdは、挿入前にデータベースに触れることによって独自の一意性をチェックしたり作成したりすることなく、ユニークであることが本当にうまくいくので、このオーバーヘッドはありません。

世界で最悪のアイデアではないと言われていますが、それがあなたのシナリオに合っていると思うなら、それを試してみてください。しかし、あなたが自動インクリメントIDを必要としないなら、 。

7

あなたはそれを行うことができますが、整数が一意であることを確認する責任があります。

MongoDBは、ほとんどのSQLデータベースのように自動インクリメントフィールドをサポートしていません。新しいデータベースエントリを作成する複数のプロセスやスレッドを持つ分散アプリケーションまたはマルチスレッドアプリケーションを使用する場合は、それらが同じカウンタを使用していることを確認する必要があります。それ以外の場合、2つのスレッドが同じ_idを持つ文書をデータベースに格納しようとします。

これが起こると、そのうちの1つが失敗します。これは、データベースが成功またはエラーを返すのを待つ必要があることを意味します(GetLastErrorを呼び出すか、書き込みの問題をと認識してとします)。これは、データを火災と忘れて送信するよりも時間がかかります。

関連する問題