如何用猫鼬添加到此架构数组?

时间:2020-11-10 21:17:23

标签: javascript node.js mongodb mongoose

这是用户架构,我要更新的部分是User.js下的ToDo(进一步)。

data.js

app.post("/data", loggedIn, async (req, res) => {
  console.log(req.body.content);
  let content = { content: req.body.content };
  User.update({ _id: req.user._id }, { $set: req.body }, function (err, user) {
    if (err) console.log(err);
    if (!content) {
      req.flash("error", "One or more fields are empty");
      return res.redirect("/");
    }
    user.ToDo.push(content);
    res.redirect("/main");
  });
});

User.js

  new mongoose.Schema({
    email: String,
    passwordHash: String,
    ToDo: {
      type: [],
    },
    date: {
      type: Date,
      default: Date.now,
    },
  })

我得到了错误:

user.ToDo.push(content);
          ^

TypeError:无法读取未定义的属性“ push”

1 个答案:

答案 0 :(得分:2)

首先,您的问题是回调不是用户。当您使用update时,回调是这样的:

{ n: 1, nModified: 1, ok: 1 }

这就是引发错误的原因。

我还建议指定数组值,如下所示:

ToDo: {
  type: [String],
}

第二个建议是尽一切可能对mongo查询。如果可以使用查询来推送对象,请执行此操作,而不是将对象存储到内存中,push使用JS函数并将对象再次保存到DB中。

当然可以,但是我认为更糟。

现在,知道了这一点,如果您只想将值添加到数组中,请尝试以下查询:

var update = await model.updateOne({
  "email": "email"
},
{
  "$push": {
    "ToDo": "new value"
  }
})

检查示例here

您正在对对象使用$set,因此您正在创建具有新值的新对象。

检查here $set的工作方式。

如果不存在的字段将被添加,否则将被更新。如果只想将元素从指定字段添加到数组中,则应$push到该字段中。

在您的代码之后,也许您想做类似的事情:

model.findOne({ "email": "email" }, async function (err, user) {
  //Here, user is the object user
  user.ToDo.push("value")
  user.save()
})

就像我之前说的那样,这行得通,但是在查询中更好。