You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:55:29