2016-06-29 10 views
1

私はいくつかの要求をトリガして、いくつかのウェブフックを起動させるプロセスを持っています。私は私のwebhooksのすべてを受け取ったときにプロセスが完了したことを知っています。私のモデルはこのように見えます。モンゴースで「レースのような」状態になった

{ 
    name: 'name', 
    status: 'PENDING', 
    children: [{ 
     name: 'child1', 
     status: 'PENDING' 
    }, { 
     name: 'child2', 
     status: 'PENDING' 
    }] 

} 

アイデアは、ウェブフックが来るように、私はCOMPLETEにsubdocサブを更新しています。各更新の最後に、他のものが完全であるかどうかを確認し、そうであれば親にstatus='COMPLETE'を設定します。別の呼び出しがそれがまだPENDINGであったが、その2回目の呼び出しが保存される前であると判断した後に、サービスの呼び出しの1つがCOMPLETEとマークされているようです。 2番目が保存されると、COMPLETEが親のPENDINGで上書きされます。ここで

は私のスキーマからのコードです:

methods: { 
    doUpdate: function(data) { 
     var child = this.children.id(data.childId); 
     child.status = 'COMPLETE'; 
     if (_.every(this.children.status, 'COMPLETE')) 
      this.status = 'COMPLETE'; 
     return this.save(); 
    } 
} 

答えて

0

解決策は、まず、mongoの変形版findAndModifyメソッドを使用して、ある操作でステータスを見つけて更新し、他の子が完了しているかどうかを確認することです。私は1回の操作で2つの更新をしようとしていました。 2つのステップに分けると、私は他の子のステータスをチェックすると、他のすべての呼び出しはドキュメントの最新の状態を持ち、間違った読みは得られませんが、別の呼び出しが完了するのを待っていることがわかります。save()

1

私はあなたがちょうどあなたの子供ではなく、文書全体を毎回上書き/保存のオブジェクトを変更して保存するときに、あなたの問題を解決することができると思います。
これを行うには、更新ステートメントにpositional $を使用できます。
基本的に、それは次のようになります。

db.yourChildrenCollection.update(
    { _id: this._id, 'children.name': childName }, 
    { $set: { 'children.$.status' : 'COMPLETE' } } 
) 

あなたは私はあなたのコレクション名などが分からないとして変数名を変更する必要がありますが、私はあなたがポイントを得ると思います。

関連する問題