Node.js .findOneAndUpdate()删除数组中的所有元素

Node.js .findOneAndUpdate()删除数组中的所有元素,node.js,database,mongodb,mongoose,discord.js,Node.js,Database,Mongodb,Mongoose,Discord.js,我正在制作discord,它有一个警告系统,效果很好,但是我想创建editwarn命令,这样如果有人键入错误,他们就可以编辑警告原因。我的代码的问题是它用新的原因替换了数组中的所有元素 你可以在图片上看到,如果我执行命令!editwarn 2因为我想编辑第二个警告不工作,所以它将数组中的所有元素替换为不工作 我的代码 //声明用户和用户ID 让user=message.notices.users.first 让split=args.slice2.join 警告.findOneAndUpdat

我正在制作discord,它有一个警告系统,效果很好,但是我想创建editwarn命令,这样如果有人键入错误,他们就可以编辑警告原因。我的代码的问题是它用新的原因替换了数组中的所有元素

你可以在图片上看到,如果我执行命令!editwarn 2因为我想编辑第二个警告不工作,所以它将数组中的所有元素替换为不工作

我的代码

//声明用户和用户ID 让user=message.notices.users.first 让split=args.slice2.join 警告.findOneAndUpdate{userID:user.id}, {$set:{原因:拆分}}, {new:true}.execerr,数据=>{ 如果犯了错误,就扔出错误; 如果!数据{ return message.replyUser没有任何警告。 }否则{ if args[1]>data.warnings返回消息.replyUser没有该警告。 modLogs.sendembed message.delete; 返回消息。回复`${user.tag}成功编辑信息` } }; 我不认为这和它有任何关系,但我会写在这里

我的计划

const mongoose=所需的mongoose; const newScheme=mongoose.Schema{ 名称:String, 警告:数字, 原因:数组, userID:String }, { versionKey:false } module.exports=mongoose.model'Warning',newScheme
在更新对象(即{$set:{reason:split}})中,您正在使用新的输入值覆盖现有数组。您应该尝试在数组中进行搜索,并使用新输入更新所需的数组值。split似乎是一个字符串。我对模式不是很熟悉,但我猜将字符串值写入数组实际上会将[value]写入文档,这就是正在发生的事情。您需要更新要更改的元素,而不是覆盖整个数组

要更新数组中的第三个元素,请使用reason.2。像这样:

let split = args.slice(2).join(" ")

let indexToUpdate = 2

Warning.findOneAndUpdate({ userID: user.id },
     { $set: { ["reason." + indexToUpdate]: split } },
 ...

在{$set:{reason:split}}中,什么是split?让split=args.slice2.join工作谢谢!我将编辑您的答案,使其100%正确。在我的例子中,至少应该让indexToUpdate=2为indexToUpdate=args[1]-2。再次感谢!