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

Posted

技术标签:

【中文标题】.findOneAndUpdate() 删除数组中的所有元素【英文标题】:.findOneAndUpdate() removes all elements in array 【发布时间】:2020-08-29 12:41:07 【问题描述】:

我正在制作带有警告系统并且效果很好的不和谐,但我想创建editwarn 命令,因此如果有人输入错误,他们可以编辑警告原因。我的代码的问题是它用新的原因替换了 Array 中的所有元素。

您可以在图片上看到,如果我执行命令!editwarn 2 (because i want to edit second warn) not working,它会将数组中的所有元素替换为not working

我的代码

//declare user and userid
let user = message.mentions.users.first()

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

Warning.findOneAndUpdate( userID: user.id ,
      $set:  reason: split  ,
      new: true ).exec((err, data) => 
          if (err) throw err;
          if (!data) 
             return message.reply("User doesn't have any warnings.")
           else 
              if (args[1] > data.warns) return message.reply("User doesn't have that warning.")
              modLogs.send(embed)
              message.delete();
              return message.reply(`$user.tag info succesfully edited!`)
         
);

我不认为这与它有任何关系,但我会写在这里

我的计划

const mongoose = require("mongoose");

const newScheme = mongoose.Schema(
    name: String,
    warns: Number,
    reason: Array,
    userID: String
, 
    versionKey: false
)

module.exports = mongoose.model('Warning', newScheme)

【问题讨论】:

在你的 $set: reason: split 中,什么是“split”? let split = args.slice(2).join(" ") 【参考方案1】:

看来split 是一个字符串。我不太熟悉模式,但我猜想将字符串“值”写入数组实际上会将 [“值”] 写入文档,这就是正在发生的事情。您需要更新要更改的元素,而不是覆盖整个数组。

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

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

let indexToUpdate = 2

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

【讨论】:

工作感谢!我会将您的答案编辑为 100% 正确。 indexToUpdate = 2 至少在我的情况下应该是 let indexToUpdate = args[1] - 2。再次感谢!【参考方案2】:

$set: reason: split 的更新对象中,您正在用新的输入值覆盖现有数组。您应该尝试做的是搜索数组并使用新输入更新所需的数组值

【讨论】:

以上是关于.findOneAndUpdate() 删除数组中的所有元素的主要内容,如果未能解决你的问题,请参考以下文章

findOneAndUpdate() 基于查找查询条件的子数组

Mongoose:通过 findOneAndUpdate 查询使用对象数组的总和更新根数据属性不起作用

Mongoose:通过 findOneAndUpdate 查询使用嵌套对象数组的总和更新父子数据属性不起作用

Mongoose - 使用 findOneAndUpdate 和数组过滤器只返回更新的项目

Mongoose findOneAndUpdate:创建然后更新嵌套数组

Mongoose findOneAndUpdate:创建然后更新嵌套数组