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

Node.js 在mongo中执行原子聚合读取和更新?,node.js,mongodb,mongodb-query,aggregation-framework,mongodb-aggregation,Node.js,Mongodb,Mongodb Query,Aggregation Framework,Mongodb Aggregation,我有一些以下格式的文件 { "count_used" : Int64, "last_used" : Date, "enabled" : Boolean, "data" : String } 我使用last\u used字段在aggregate查询中进行排序,以便首先提供上次使用的文档。我在聚合之后使用updateOne,使用下面的查询来填充上次使用的字段。因此,每个读取请求都会更改上次使用的字段日期戳 updateOne( { _id

我有一些以下格式的文件

{
    "count_used" : Int64,
    "last_used"  : Date,
    "enabled"    : Boolean,
    "data"       : String
}
我使用
last\u used
字段在
aggregate
查询中进行排序,以便首先提供上次使用的文档。我在聚合之后使用
updateOne
,使用下面的查询来填充上次使用的字段。因此,每个读取请求都会更改上次使用的字段日期戳

updateOne(
    { _id: result['_id']}, 
    {
        $currentDate: { 'last_used': true }, 
        $inc: { 'count_used': 1 }
    }
)
我遇到的问题是,客户机将发出5个并发请求,而不是接收文档1,2,3,4,5,例如,他们将得到1,1,1,2,2

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

这有什么办法吗

使用以下聚合节点代码更新

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

}

问题在于,多个读取请求来自发出多个并发请求的同一客户机,这意味着它们同时命中数据库,并在触发
updateOne
之前读取相同的数据

您可以添加聚合查询吗?我想知道那是什么样子。你找到解决这个问题的办法了吗?我有一个类似的问题一个想法是使用$merge作为聚合管道的最后一个阶段,以避免有两个单独的查询,但我不确定这是否是原子的: