2011-09-16 21 views
2

今、私たちは、MongoDBのベーキングインIDを使用して、独自のID生成をすべて行っています。データベースに何かを追加する前に、オブジェクトのIDを作成する必要がある場合があります。MongoDBのヘルプとユニークなIDの生成

私たちはエントリを作成してIDを取得し、それが必要ない場合はエントリを削除できますが、そのような簡単な作業のためにシステムに負荷をかけることはありません。これは、データベースに不必要な負荷をかけずに、mongosのネイティブメソッドと同期する方法はありますか?あなたは、データベース内のIDとしてBSONたObjectIdを使用する必要はありません

おかげ

答えて

6

これはかなり単純です。 upsert操作を除いて、ObjectIdはクライアント側で生成されます。あなたのアプリの中から保存操作を実行するときに、他の言葉では、ドライバが自動的に行います(擬似):

if(!doc.containsKey("_id")) 
    doc.put(_id, new ObjectId()); 

だからあなたがしなければならないすべては、あなたがそれを行う必要があるものは何でも、のObjectIdを自分で生成されますmongoドライバにあなたのためにそれをさせるのではなく、ドキュメントの_idをその値に設定してください。

これは、であり、正確にはで、ドライバがIDを生成するのと同じくらい安全です。 ObjectIdsは、IDの衝突を排除するように設計されています(読んでください:衝突のポイントが無関係になることはまずありません)。また、IDの生成から格納までの間にID衝突の問題が発生することもありません。

の場合、データベースにすでに存在する_idを持つドキュメントは、その_idで元のドキュメントを上書きします。

あなたはすでにあなたが重複_idエラー(エラー11000)を取得しますが存在する_idを持つ文書を挿入場合。

+0

新しいObjectIdを生成するだけで、何も心配することなく通常は 'collection.insert'できますか?途中で '_id:'がプリミティブな文字列にならないようにする必要がありますか?同じ '_id'を持つドキュメントを別のドキュメントと挿入した場合、どうなりますか?情報をありがとう! – fancy

+0

はい、独自の_idを生成してから挿入するのは、_idのない保存操作とまったく同じです。あなたはそれがObjectIdのままであることを確認する必要があります。あなたの最後のポイントをカバーするために私の答えを編集します。 –

+0

Redisに出入りすることは、私が心配していたプロセスが、それを原始的な文字列に解析するプロセスでした。 – fancy

1

http://www.mongodb.org/display/DOCS/Object+IDsを参照してください)。あなたは自分で自由に生成することができます。 C#ドライバは、クライアント側のObjectIdsを生成する方法を提供します。 MongoDBを呼び出すためにどのようなjavascriptドライバを使用していますか?新しいObjectIdを生成する呼び出しはありませんか?

+0

私はmongo-nativeドライバを使用しています。 「プライマリキーファクトリ」と呼ばれるものがありますが、dbコール中にそれらを生成するので、それが必要なのかどうかはわかりません。 – fancy

+0

私は自分のIDで渡すことができますが、私はmongoによって生成されたIDと衝突しないことを100%確実にする方法を知らない。 – fancy

+0

すべてのObjectIdはクライアントサイドで生成されますが、サーバー側で行うupsertは例外です。 –

関連する問題