我有一个 lastTracks 集合,我打算用新的曲目数据更新它。
我尝试使用MongoDB驱动程序为NodeJS使用这段代码:
db.collection('lastTracks').updateOne(
{
'track.deviceID': lastPacket.deviceID,
timestampZero: {$lte: lastPacket.timestamp}
},
{
$set: {
timestampZero: lastPacket.timestamp,
},
$setOnInsert: {'track.deviceID': lastPacket.deviceID}
},
{ upsert: true}
);
我想要做的是对timestampZero执行更新,如果收集中有deviceID的文档,并且它的timestampZero低于或等于数据包的时间戳;如果没有这样的文件,那么插入它。
问题是每当这段代码运行时,插入一个新文档并且在给定deviceID的现有文档上不会发生更新操作。即使我为'track.deviceID'创建了一个索引。发生重复键错误。
更新:
我发现每次插入新文档的原因是因为在集合中有一个文件具有相同的deviceID但是时间戳更大,因此我的更新条件的计算结果为false,然后Mongo尝试插入一个新文档(正如我想要的那样) UPSERT:真)。
但我想要的是,如果时间戳大于lastPacket.timestamp既不更新也不插入发生
通过一点点搜索,我发现我的解决方案可能只是在“tracks.deviceID”上创建一个独特的索引。然后忽略重复的错误:https://github.com/winstonjs/winston#logging-levels
或者我可以进行两阶段提交:https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/
第一个解决方案工作简单而且很好但是感觉不对,第二个解决方案对于理解和实现都有点复杂,所以我的问题是有没有更好的方法呢?