2016-10-05 33 views
1

私は最大IDを取得していて、max id + 1を使用して挿入しているコレクションを持っています。このIDの列はこのコレクション内で一意です。MongoDBでの同時読み込み/書き込み

このサービスの複数のインスタンスが呼び出されると、並行アプリケーションは同じコレクションを読み取り、最大IDを取得します。しかし、同じコレクションにアクセスすると同じ最大IDが複数のインスタンスに返されるため、このコレクションからデータを読み込みながら明示的にロックを取得し、Mongo DBに書き込んだ後にロックを解放できますか?

+0

外部同期または組み込み同期コレクションを使用してみましたか? –

+0

MongoDBでコレクションを同期していますか? –

+0

達成したいことをもう少し書くことができますか?トランザクションが必要なように見えるので、ここではMongoDBが最適なオプションではないかもしれません。 [自動インクリメントシーケンスフィールド](https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/#auto-increment-counters-collection)または[$ inc](https ://docs.mongodb.com/manual/reference/operator/update/inc/)いくつかのカウンタをインクリメントするためのアトミックな方法が必要な場合 – mkorszun

答えて

1

mongoDBメソッドcollections.findAndModify()を使用すると、独自の「get-and-increment」クエリを作成できます。例えば

db.collection_name.findAndModify({ 
    query: { document_identifier: "doc_id_1" }, 
    update: { $inc: { max_id: 1 } }, 
    new: true //return the document AFTER it's updated 
}) 

https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/

は、より多くの助けのために、このページを見てみましょう:

https://www.tutorialspoint.com/mongodb/mongodb_autoincrement_sequence.htm

+0

このリンクは質問に答えるかもしれませんが、答えの本質的な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューより](/レビュー/低品質の投稿/ 13890230) – rpax

+0

@rpax入力いただきありがとうございます、私は投稿を編集しました。 – ToreDenStore

+0

それは素晴らしいです!あなたは私を持っています。 +1。 – rpax

0

代わりのを取得し、このアプローチを試してみてください3210を読み取り、それをmax id + 1としてインクリメントします。

いる間だけで、文書/コレクションを与える複数のインスタンスのために読んで、以下の論理に従っ

Let us have the below part in a synchronized block, so that no two threads gets the same max id 
synchronize() { 
    getMaxId from collection 
    increase it by 1 
    insert the new document 
} 

の更新中に参照してください:

https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/

https://www.tutorialspoint.com/mongodb/mongodb_autoincrement_sequence.htm

はそれが役に立てば幸い!

関連する問題