为啥 Mongoose 插入 null 作为子文档数组的最后一个元素?

Posted

技术标签:

【中文标题】为啥 Mongoose 插入 null 作为子文档数组的最后一个元素?【英文标题】:Why does Mongoose insert null as the last element of the subdocuments array?为什么 Mongoose 插入 null 作为子文档数组的最后一个元素? 【发布时间】:2021-10-28 15:38:30 【问题描述】:

我有一个带有子文档数组的 Mongoose 架构,如下所示:

const cardsSchema = new mongoose.Schema(
  cards: [
    
      front: String,
      back: String,
      nameOfSuperset: String,
      nameOfSet: String,
    ,
  ],
);

const Cards = mongoose.model("Cards", cardsSchema);

我已经从上述模型创建了一个文档,并且我在这个文档的子文档数组中推送了几个对象:

exports.createCards = async (req, res, next) => 

  const userCards = await Cards.findById(req.user.cards);

  for (let i = 0; i < req.body.cards.length; i++) 
    userCards.cards.push(req.body.cards[i]);
  

  const created = await userCards.save();
  console.log(created);

  res.status(201).json(
    status: "success",
  );
;

当我 console.log 这个保存的文档,或者在 MongoDB Compass 中查看它时,子文档数组末尾的文档中有 null。我不会在本文档中推送任何空对象。我从中获取要推送的对象(r​​eq.body.cards)的原始数组没有空元素或空对象。我有控制台。记录它。

这个 null 是什么,我怎样才能摆脱它?

【问题讨论】:

您可以将updateOne$push$each 运算符一起使用以将文档推送到数组中。 refer example. 用 forEach 替换 for 并尝试 @mohammadNaimi 它奏效了。谢谢你。我只是好奇 for 循环有什么问题? @turivishal await Cards.updateOne( _id: req.user.cards , $push: cards: $each: req.body.cards ); 有效。感谢您的评论。 如果可以做出回答并接受它?如果问题已经解决了它来自循环 【参考方案1】:

forEach替换for循环

req.body.cards.forEach(item=>
userCards.cards.push(item)
)

【讨论】:

以上是关于为啥 Mongoose 插入 null 作为子文档数组的最后一个元素?的主要内容,如果未能解决你的问题,请参考以下文章

为啥插入子文档数组时出现“重复键错误”?

使用 mongoose 一次将多个 ObjectId 插入子文档

mongoose 给文档的子数组的头部插入数据

Mongoose 中的多个文档更新插入

将新对象插入到 mongoose 中的子文档数组字段中

将新对象插入到 mongoose 中的子文档数组字段中