在mongo中执行原子聚合读取和更新?

时间:2016-09-26 09:55:39

标签: node.js mongodb mongodb-query aggregation-framework mongodb-aggregation

我有一些格式低于

的文件
{
    "count_used" : Int64,
    "last_used"  : Date,
    "enabled"    : Boolean,
    "data"       : String
}

我使用last_used字段在aggregate查询中进行排序,以便首先提供上次使用的文档。我在聚合后使用updateOne使用以下查询来碰撞最后使用的字段。因此,每个读取请求都将更改last_used字段日期戳。

updateOne(
    { _id: result['_id']}, 
    {
        $currentDate: { 'last_used': true }, 
        $inc: { 'count_used': 1 }
    }
)

我遇到的问题是客户端将发出5个并发请求,而不是接收文档1,2,3,4,5,例如,他们将获得1,1,1,2,2。

我猜这是因为读取和更新之间没有锁定,因此在执行更新之前,几次读取会得到相同的结果。

这有什么办法吗?

使用以下聚合nodejs代码

更新

db.collection('testing').aggregate([{
    $project: {
    last_used  : 1,
    count_used : 1,
    doc_type   : 1,
    _id        : 1,
    data       : 1,
    is_type    : { $setIsSubset: [ [type], '$doc_type' ] }
    }
},
{ $match: {
    $or: query} 
},
{ $sort: { 
    is_type: -1, 
    last_used: 1 
    } 
},
{ 
  $limit: 1 
} ]).next(function (error, result) {  

    db.collection('adverts').updateOne({_id: result['_id']}, {$currentDate: {'last_used': true}, $inc: {'count_used': 1}})        

}

问题是多个读取请求来自发出多个并发请求的同一客户端,这意味着他们同时命中db并在updateOne触发之前读取相同的数据。

0 个答案:

没有答案