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

如何在Mongoose JS中更新数组?Discord待办机器人问题排查

问题解决:MongoDB数组字段无法更新的原因及修复

你遇到的核心问题是字段名大小写不匹配:

  • 你的Mongoose Schema中定义的数组字段是全小写的todolist
  • 但在findOneAndUpdate操作里使用的是驼峰式的todoList

MongoDB对字段名大小写敏感,这就导致$push操作找不到目标字段,自然无法修改数组内容,而字符串字段itemToAdd因为字段名完全匹配,所以能正常更新。

修复方案(二选一即可)

方案1:修改Schema字段名(推荐,符合JS命名规范)

把Schema里的todolist改成todoList,保持和代码中的调用一致:

const todoSchema = new mongoose.Schema({
  todoList : [String], // 统一为驼峰命名
  _id: {
    type : String,
    required : true
  },
  itemToAdd:{
    type: String,
    required: false
  },
  indexOfItemToRemove:{
    type: Number,
    required: false
  }
});

方案2:修改更新操作中的字段名

如果不想改动Schema,就把findOneAndUpdate里的todoList改成todolist:

await list.findOneAndUpdate(
  {_id: id},
  {$push:{todolist: msg}, itemToAdd:msg}, // 匹配Schema中的全小写字段名
  {upsert : true}
)

额外优化建议

  1. 用startsWith替代includes判断命令,避免误触发:
// 原代码:message.content.includes('!listadd ')
// 修改后:
if (message.content.startsWith('!listadd ')) {
  // ...逻辑不变
}
  1. 优化!listget命令,返回完整待办列表:
if (message.content.startsWith('!listget')){
  let doc = await list.findOne({_id:id});
  if (!doc || doc.todoList.length === 0) {
    message.reply('你的待办列表为空!');
  } else {
    const listContent = doc.todoList.map((item, idx) => `${idx+1}. ${item}`).join('\n');
    message.reply(`你的待办列表:\n${listContent}`);
  }
}

内容的提问来源于stack exchange,提问作者Loganator2099

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 09:36:20