如何在MongoDB中为安全更新记录创建复杂值?

She*_*bic 1 mongodb

我有一个db如下:

score:0
timeScore:86400
totalScore:0
time:1234567777  // Any time stamp
Run Code Online (Sandbox Code Playgroud)

现在每次用户投票

增量($ inc)得分+1然后我将timeScore更新为例如 (86400 / nowTimestamp() - time + 1 ) 然后我将totalScore更新为(timeScore + score)

例如:第二次更新后的最终值:

score:1
timeScore:86400
totalScore:86401
time:1234567777 
Run Code Online (Sandbox Code Playgroud)

问题是,在我的外部计算期间,可能是另一个用户在分数中添加+1并计算总数并在我更新数据之前写入其值,因此会出现数据损坏.

现在我如何解决这个问题或如何使其安全?

dav*_*veh 5

您应该能够使用mongodb findAndModify函数,该函数允许您进行原子更新,这意味着在您的文档被更改时,其他查询无法更新该值.文档可在此处获得.在将数据推送到存储之前,您可能还希望查看执行尽可能多的计算,因为这将消除读取然后写入的需要.