【问题标题】:Getting Node.js + Express REST API to update mongoDB获取 Node.js + Express REST API 来更新 mongoDB
【发布时间】:2021-10-10 03:51:14
【问题描述】:

我有一个包含多个用户的 mongoDB 集合,格式如下:

_id: 60fd0e98ead1734a1cf735c7

username: "某个用户名"

__v: 0

我可以使用另一种 POST 方法使用此数据库创建新用户。但是,我无法让它更新。浏览器将使用 res.send(result) 返回预期的结果。但是,当我检查时,mongoDB 数据库永远不会改变。 mongoDB 是否需要额外的步骤?如果 res.send(result) 在浏览器中是正确的,如果不在 mongoDB 中,它在哪里?代码如下:

const Schema = mongoose.Schema
const usernameSchema = new Schema({username: String,})
const username = mongoose.model("username", usernameSchema)

app.post('/api/users/:_id/exercises', async (req, res) => {

  let user_id = req.body._id
  let query = { _id: user_id }
  let new_username = req.body.username

  username.findOne(query, function (err, result) {
    if (err) {
      console.log(err);
      res.sendStatus(500);
      return
    }
    if (result) {
      result.username = new_username;
      res.send(result)
    }
  })

})

【问题讨论】:

    标签: node.js mongodb rest express


    【解决方案1】:

    如 mongoose ( ) 的文档中所述,您必须在文档上调用 save() 才能更新它。

    document.save(function (err) {
      if (err) return handleError(err);
      // saved!
    });
    

    或者不先加载文档,你可以使用 findOneAndUpdate

    let query = { _id: user_id }
    Model.findOneAndUpdate(query, { username: new_username })
    

    https://mongoosejs.com/docs/api.html#model_Model.findOneAndUpdate

    【讨论】:

    • 谢谢!我使用了 findOneAndUpdate 并且它有效,我只需要确保按照猫鼬文档使用回调。因此,如果我仍在尝试使用 findOne,则在此函数中更新用户名,然后使用单独的 username.save 保存到 mongoDB,但它不会更新数据库。你知道为什么吗?
    • @trily84 我认为您必须将属性标记为已修改:stackoverflow.com/a/56679174/4572590
    【解决方案2】:

    按照上面的建议,根据猫鼬文档使用 findOneAndUpdate。下面的代码有效:

    let options = {useFindAndModify: false, new:true} 
    
    username.findOneAndUpdate(query, { username: new_username}, options, (err, result) => {
        if (err) return err
        //console.log(result)
        res.send(result)
      })
    

    但是,当我修改代码以将对象推送到数据库但由于某种原因无法正常工作时。这是未进行更新的新代码。下面的代码有什么问题?

    const exObj = { 
        description: req.body.description,
        duration: req.body.duration,
        date: req.body.date
      }
    
      let options = {useFindAndModify: false, new: true} 
    
      username.findOneAndUpdate(query, { $push: { exercise: exObj } }, options, (err, result) => {
        if (err) return err
        res.send(result)
      })
    

    【讨论】:

    • 我终于明白了。原来我必须定义猫鼬模式以将这些键/值包含在要添加的对象中。
    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2019-01-14
    • 2021-03-11
    • 2016-10-13
    • 1970-01-01
    相关资源
    最近更新 更多