我有一些格式低于
的文件{
"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
触发之前读取相同的数据。