【问题标题】:How can I add to this schema array with mongoose?如何使用 mongoose 添加到此模式数组?
【发布时间】:2021-07-01 00:09:35
【问题描述】:

这是用户架构,我要更新的部分是 User.js 下的 ToDo(进一步向下)。我正在尝试将新数据添加到数据库中的数组中。

数据.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");
  });
});

用户.js

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

最初我尝试使用 .push() 属性,但出现错误:

user.ToDo.push(content);
          ^

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

【问题讨论】:

  • 这意味着 user.ToDo 未定义,因此您无法推送它。可能有更好的方法,但我通常最终使用类似:Array.isArray(user.ToDo) ? user.ToDo.push(content) : user.ToDo = [content]
  • 它肯定存在,因为我在robo3t中看到了我的初始值。不过我会试试这个谢谢
  • 我刚刚在您的架构中看到您将 ToDo 作为一个对象。你不能push 一个对象。
  • 你的意思是user.ToDo.type.push(content)
  • 这样,它创建了数组,但没有添加任何内容

标签: javascript node.js mongodb mongoose


【解决方案1】:

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

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

这就是引发错误的原因。

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

ToDo: {
  type: [String],
}

第二个建议是尽你所能进入mongo 查询。如果您可以使用查询来推送对象,请这样做而不是将对象存储到内存中,push 使用 JS 函数并将对象再次保存到数据库中。

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

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

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()
})

正如我之前所说,这可行,但最好在查询中执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2017-03-24
    • 1970-01-01
    • 2018-07-18
    • 2019-02-13
    相关资源
    最近更新 更多