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作为聚合管道的最后一个阶段,以避免有两个单独的查询,但我不确定这是否是原子的: