Discord.js+MongoDB如何实现全局更新所有用户账户薪资数据
解决方案
你可以通过MongoDB提供的updateMany方法实现全量用户数据更新,修改后的完整代码如下:
const profileModel = require("../models/profileSchema"); module.exports = { name: 'pay', aliases: [], permissions: ["ADMINISTRATOR"], description: "pay users their salary", async execute(message, args, cmd, client, discord, profileData) { const amount = profileData.pay; try{ await profileModel.updateMany( {}, // 空查询条件匹配集合内所有用户文档 { $inc: { bank: amount, }, } ); return message.channel.send(`所有用户薪资已发放完成。`); } catch(err) { console.log(err); return message.channel.send(`薪资发放失败,请查看控制台错误日志。`); } }, };
修改说明
- 删除了原代码中获取提及用户的逻辑,不需要再@指定用户即可执行
- 原本的
findOneAndUpdate只能更新单条匹配到的文档,替换为updateMany方法后支持批量更新所有匹配文档 - 第一个参数传空对象
{}会匹配数据库中该集合下的所有用户记录,所有用户的bank余额都会增加设定好的薪资数额
可选优化&注意事项
- 如果你的数据是多服务器共用同一个集合,希望只给当前触发命令的服务器用户发薪资,可以把第一个参数的空对象改成
{ guildID: message.guild.id }(需要你对应的Schema里存了guildID字段),避免跨服务器发薪 - 如果需要在发送的消息里展示实际发放的用户数量,可以调整代码:
const updateRes = await profileModel.updateMany( {}, { $inc: { bank: amount } } ); return message.channel.send(`已成功向 ${updateRes.nModified} 位用户发放薪资。`); - 首次执行前建议先在测试环境验证金额逻辑,避免全量更新错误导致数据问题
内容的提问来源于stack exchange,提问作者Tyyppi155
相关产品推荐
相关产品推荐

