1

現在のプロジェクトで mongo の更新に問題があります。MongoDB で管理されているドキュメント プールがあります。リーダー プロセスは、このプールからドキュメントのバッチを取得します。DB からのドキュメントが再度取得されないようにするために、各ドキュメントに関連付けられたステータスが変更されます (たとえば、到着から処理中)。

スケールアップして、複数のリーダー プロセスで異なるバッチを取得することを検討しています。ただし、私の理解では、mongo の更新はバッチでアトミックではありません。これを達成する方法はありますか?ドキュメントは、前のリーダーによって更新される前に、別のリーダーによってプールから取得されません。基本的に、アトミックなバッチ更新を検討しています。ありがとう!!

4

2 に答える 2

1

おそらく、像を更新するために次のようなことをしているでしょう:

db.docs.update({status:"arrived"},{$set:{status:"processing"}},{multi:true})

続いて、ステータスが「処理中」のドキュメントがロードされます。

現在、一致するすべてのドキュメントよりも少ないが複数のドキュメントを更新するという mongo の呪文はありません。すべてのドキュメントに使用する{multi:true}か、1 つのドキュメントのみにマークを付けます。

それを考えると、非マルチ更新を使用して、各リーダー プロセスの一意の ID で到着したドキュメントをマークしてみてください。次に、処理するドキュメントを読み取ります。マーキングは、1 つのドキュメントを 1 つのリーダーの一意の ID でアトミックに更新するため、リーダー間の競合が回避されます。

何かのようなもの:

db.docs.update({status:"arrived"},{$set:{status:"processing", readerId:<myid>}})

<myid>、この mongo 更新を発行するリーダー プロセスの一意の ID 値です。

次に、リーダーは次のようにドキュメントをロードできます。 db.docs.find({status:"processing", readerId:<myid>}}

于 2013-05-02T04:32:37.563 に答える
0

を使用findAndModifyすると、ドキュメントをアトミックに検索して更新できます。

もし、あんたが

db.docs.findAndModify({
    query : {'status':'arrived' }, 
    sort: { dateTimeOfdoc:-1},
    update : { 'status':'processing','transactionId':12345},
    new : true});

すべてのスレッドがドキュメントを求めて競合しますが、各ドキュメントはアトミック操作で検索および変更できるため、スレッドがドキュメントを取得すると、他のスレッドによって取得されることはありません。

ご希望のドキュメントのバッチではありませんが、問題は解決していますか?

于 2013-05-02T21:44:37.583 に答える