mongoose.findByIdAndUpdate 只会保存被推入数组的对象的第一个键值

Posted

技术标签:

【中文标题】mongoose.findByIdAndUpdate 只会保存被推入数组的对象的第一个键值【英文标题】:mongoose.findByIdAndUpdate will only save the first key-value of object being pushed into array 【发布时间】:2021-12-19 02:11:20 【问题描述】:

我有一个简单的对象,其中存储了两个值,每个值都是来自客户端发送的数据的 req.body 值。

const pushedVote = 
      answer: req.body.answer, 
      text: req.body.value
    

现在,当我调用 findByIdAndUpdate 方法时,它看起来像这样(Poll 是我的模型)

//insert answer and text 
    await Poll.findByIdAndUpdate(req.body.id, 
      $push: 
        responseAnswers: pushedVote,
      ,
    );

这一切都很好,但奇怪的是我的数据库中更新的数组只会存储对象中的第一个键值对。例如,如果正在存储的 pushVote 对象的答案为“A”,文本为“Cat”,则数据库将只存储“A”,而不是“Cat”。我在这里遗漏了什么吗?

【问题讨论】:

我假设responseAnswers 是一个投票数组?如果是这样,最好分 3 个步骤执行此操作以保持清洁。 1.const poll = awat Poll.findOne( _id: mongoose.Types.ObjectId(req.body.id) ); 2.poll.responseAnswers.push(pushedVote); 3.await poll.save(); @KingJ 这也有效,但同样的事情正在发生。在我的数据库中,推入 responseAnswers 数组的对象仅包含答案键,而不包含答案和文本键 在更新数据库之前,您是否确认req.body.value 存在于请求中并且在pushedVote 对象中可用?要检查的另一件事是您的架构是否支持 text 属性。 @Kingj 哇,我不敢相信我忘记在架构中添加该文本属性。感谢您的帮助 别担心!很高兴它被排序了! 【参考方案1】:

根据我的评论,请确保 text 属性在 Mongoose 架构中定义,否则将不会保存到数据库中。

【讨论】:

以上是关于mongoose.findByIdAndUpdate 只会保存被推入数组的对象的第一个键值的主要内容,如果未能解决你的问题,请参考以下文章