Mongoose:使用 find() 并将值归因于变量时,save() 不是函数

Posted

技术标签:

【中文标题】Mongoose:使用 find() 并将值归因于变量时,save() 不是函数【英文标题】:Mongoose: save() is not a function when using find() and atributing value to variable 【发布时间】:2021-03-20 23:53:59 【问题描述】:

这是我正在使用 mongoose 处理的 Schema 的基本结构:

  const User = 
    uid: 
      type: String
    ,
    routes: 
      type: Array
    
   

在我的应用程序中有一个到 /route 的 POST,其中 uid 和一个新的 route 作为“正文参数”提供。为了添加到 routes 数组中,我写了一个类似这样的代码(唯一的区别是我检查路由是否已经存在):

  var user = await User.find(uid: uid) // user is found, as expected
  user[0].routes.push(route //parameter)  
  user.save()   

但是,当发出 POST 请求时,它会引发错误:

TypeError: user.save 不是函数

我做错了什么?

【问题讨论】:

【参考方案1】:

您的代码中的user 是一个文档数组

所以您将在该数组中拥有 mongo 文档

你不能做array.save,你必须做document.save

await user[0].save()

var user = await User.find(uid: uid) // user is found, as expected
if (user && user.length) 
    user[0].routes.push(route //parameter)  
    await user[0].save(); // save the 1st element of the object

如果您的查询只返回 1 条记录,最好使用 https://mongoosejs.com/docs/api.html#model_Model.findOne

var user = await User.findOne(uid: uid) // user is found, as expected
if (user) 
    user.routes.push(route //parameter)  
    await user.save(); // save the 1st element of the object

【讨论】:

【参考方案2】:

如果您只需要找到一个特定的用户,您应该使用findOne 函数

User.findOne(uid: uid)
.then(
    (user) => 
        user[0].routes.push(route //parameter);
        user.save();
    ,
    (err) => 
        console.error(err);
    
)

【讨论】:

以上是关于Mongoose:使用 find() 并将值归因于变量时,save() 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 使用 find() 查询文档,其中嵌套数组值的总和在一定范围内

从 mongoose find() 查询中提取一个值

Mongoose .find 带有 req.params 数组?和 res.json 每个值和计数的数组?

mongoose使用之查询篇

更新 findOne()/find()/findById() 返回的文档 - mongoose

更新 findOne()/find()/findById() 返回的文档 - mongoose