与猫鼬一起“比赛”的情况

时间:2016-06-29 02:48:25

标签: node.js mongodb mongoose

我有一个触发大量请求的进程,这些请求会触发大量的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();
    }
}

2 个答案:

答案 0 :(得分:1)

我认为您可以在修改和保存子对象时解决您的问题,而不是每次都保存/覆盖整个文档。
为此,您可以在更新声明中使用positional $ 基本上它看起来像这样:

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

您必须修改变量名称,因为我不知道您的集合名称等。但我认为您明白了这一点。

答案 1 :(得分:0)

解决方案是首先使用mongo findAndModify方法的变体在一个操作中查找和更新状态,然后检查其他子项是否已完成。我试图在一次操作中做两次更新。通过将其分解为两个步骤,我知道当我检查其他子节点的状态时,所有其他调用将具有文档的最新状态,并且在另一个调用等待save()时不会得到错误的读取完成。