Mongoose使用findOneAndUpdate更新嵌套字段不覆盖原有值的方案
问题原因
你当前的写法是直接传入完整的systems嵌套对象作为更新参数,Mongoose会直接替换整个systems字段的现有值,而非仅修改你指定的子字段,因此systems.reactChat、systems.notification.tiktok.user等未在更新参数中声明的字段都会被清空。
解决方法
使用MongoDB的$set操作符,搭配嵌套字段的点语法精确指定要更新的字段路径,即可仅修改目标字段,不会影响其他原有字段。
正确的代码示例:
GuildSchema.findOneAndUpdate( { guildId: id }, { $set: { 'systems.notification.tiktok.endCooldown': String(Date.now() + 86400000) // 24小时后冷却结束 } }, () => {} )
如果需要同时更新同层级的多个字段,只需在$set中新增对应路径的配置即可,不会互相影响:
GuildSchema.findOneAndUpdate( { guildId: id }, { $set: { 'systems.notification.tiktok.endCooldown': String(Date.now() + 86400000), 'systems.notification.tiktok.user': 'newTikTokUser' } }, () => {} )
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

