Mongoose调用document.updateOne()更新时points、earnings字段不生效问题
问题定位与修复方案
故障原因
你代码的更新参数中重复声明了$inc操作符作为对象键:JavaScript 普通对象中如果出现重复的键名,后定义的键值会直接覆盖前面的所有同名键值。因此你写的三个$inc配置,只有最后一个$inc: { balance: xx }会生效,points和earnings的增量规则直接被覆盖丢失,自然不会更新。
另外你额外添加的referer: partner.referer、grandReferer: ref.referer属于冗余逻辑,你本身就是通过对应referer条件查询出来的文档,不需要再主动赋值该字段,额外写入反而可能意外覆盖该字段的原有值,建议直接删除。
修正后的代码
const username = req.params.username; try { const partner = await Partner.findOne({ username }); await partner.updateOne({ isApproved: true }); const ref = await Partner.findOne({ username: partner.referer }); if (ref) { // 合并$inc的所有字段到同一个对象内 await ref.updateOne( { $inc: { points: 10, earnings: 10, balance: 10 }, $push: { downlines: partner.username }, }, { new: true } ); const grandRef = await Partner.findOne({ username: ref.referer }); if (!grandRef) { res .status(200) .json( 'Partner approval was successfull with a referrer but no grand referrer' ); } else { // 同样合并$inc的所有字段 await grandRef.updateOne( { $inc: { points: 3, earnings: 3, balance: 3 }, $push: { grandDownlines: partner.username }, }, { new: true } ); res .status(200) .json( 'Partner approval was successfull with both referrer and grand referrer' ); } } else { res .status(200) .json( 'Partner approval was successfull without a referrer or a grand referrer' ); } } catch (err) { res.status(500).json('Something went wrong'); console.log(err); }
内容的提问来源于stack exchange,提问作者Brilliant Atosam
相关产品推荐
相关产品推荐

