我有一个触发大量请求的进程,这些请求会触发大量的webhook。当我收到所有的webhook时,我知道这个过程已经完成了。我的模型看起来像这样。
{
name: 'name',
status: 'PENDING',
children: [{
name: 'child1',
status: 'PENDING'
}, {
name: 'child2',
status: 'PENDING'
}]
}
这个想法是随着webhook的进入,我将subdoc更新为COMPLETE
。在每次更新结束时,我会检查其他更新是否完整,如果是,我在父级上设置status='COMPLETE'
。在另一个调用确定它仍然是COMPLETE
但在第二次调用保存之前,看起来服务的一次调用将其标记为PENDING
。当第二个保存时,它将覆盖父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 :(得分:1)
我认为您可以在修改和保存子对象时解决您的问题,而不是每次都保存/覆盖整个文档。
为此,您可以在更新声明中使用positional $
基本上它看起来像这样:
db.yourChildrenCollection.update(
{ _id: this._id, 'children.name': childName },
{ $set: { 'children.$.status' : 'COMPLETE' } }
)
您必须修改变量名称,因为我不知道您的集合名称等。但我认为您明白了这一点。
答案 1 :(得分:0)
解决方案是首先使用mongo findAndModify
方法的变体在一个操作中查找和更新状态,然后检查其他子项是否已完成。我试图在一次操作中做两次更新。通过将其分解为两个步骤,我知道当我检查其他子节点的状态时,所有其他调用将具有文档的最新状态,并且在另一个调用等待save()
时不会得到错误的读取完成。