MongoDB仅在分数更高时更新分数的实现问题
解决MongoDB保留玩家最高分数的问题
问题根源
你之前的写法错误在于把$set和$max拆成了两个独立参数传给updateOne,但MongoDB的updateOne方法要求第二个参数是包含所有更新操作符的单个对象,分开写会导致操作符被忽略,自然不会生效。另外_id不需要用$set手动设置——查询条件已经指定了_id,开启upsert: true时,插入新文档会自动用这个_id。
正确代码实现
const users = await mongodb.getDb() .db('footballers') .collection('users') .updateOne( { _id }, { $set: { name }, // 按需更新玩家姓名,_id无需手动设置 $max: { score } // 仅当新分数大于旧值时更新 }, { upsert: true } );
代码说明
$set: { name }:如果允许玩家修改昵称,这个操作会始终更新姓名;如果昵称固定,也可以去掉这部分,仅在首次插入时设置。$max: { score }:MongoDB会自动对比数据库中已有的score和传入的新score,只有新分数更高时才会更新字段。upsert: true:当玩家不存在时,自动插入新文档,此时$max会直接把传入的score作为初始值(因为没有旧值,默认取新值)。
验证逻辑
- 玩家已有5分,新得3分:
$max对比5和3,不更新分数,保持5分 - 玩家已有5分,新得6分:
$max将分数更新为6分 - 玩家不存在:直接插入新文档,姓名和分数设为当前传入的值
内容的提问来源于stack exchange,提问作者Joe Consterdine
相关产品推荐
相关产品推荐

