与“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()
完成。