与“mongoose”竞争状态

我有一个过程,触发了一些请求,反过来触发了一些webhooks。 当我收到所有的webhook时,我知道这个过程已经完成。 我的模型看起来像这样。

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

这个想法是因为webhooks进来,我更新subdoc到COMPLETE 。 在每次更新结束时,我检查其他人是否完整,如果是,我在父母上设置status='COMPLETE' 。 它看起来像是一个服务的调用将其标记为COMPLETE在另一个调用确定它仍然是PENDING之后,但在第二个调用保存之前。 当第二个保存时,它会用父母上的PENDING覆盖COMPLETE

以下是我的模式中的代码:

 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(); } } 

我想你可以解决你的问题,当你修改并保存你的子对象,而不是每次保存/覆盖整个文档。
要做到这一点,你可以在更新语句中使用位置$ 。
基本上它看起来像这样:

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

你必须修改variables名称,因为我不知道你的集合名称等,但我认为你明白了。

解决办法是先在一个操作中查找并更新状态,使用mongo的findAndModify方法,然后检查其他子项是否已经完成。 我试图在一个操作中做两个更新。 通过分解为两个步骤,我知道当我检查其他孩子的状态时,所有其他的调用将具有最近的文档状态,而不会有错误的阅读,而另一个调用正在等待save()完成。