【问题标题】:Mongoose: Array of objects not saving猫鼬:未保存的对象数组
【发布时间】:2015-07-26 20:59:17
【问题描述】:

我正在尝试将对象 id 添加到 mongoose (Node.js) 中的数组中。这是我的代码:

app.post('/api/users/:userId/favorites/:objectId', function(req, res, next) {
    User.findByIdAndUpdate(req.params.userId, {$addToSet: {user_favorites: req.params.objectId}}, {safe: true, upsert: true}, function(err, data){
        if (err) return res.status(500).send(err)

        res.status(200).send({'message':'saved'});
    })
})

这是我的模型:

module.exports = mongoose.model('User',{
    ...
    user_favorites: [{ type: mongoose.Types.ObjectId, ref: 'Property' }],
    ...
})

没有返回错误,但没有将 id 添加到数组中。我错过了什么?

【问题讨论】:

  • 您还向数组/集合添加了一个字符串。您需要将其转换为ObjectIdvar id = mongoose.Types.ObjectId(req.params.objectId);。您还需要验证用户输入的格式,它必须是 12 个字节的单个字符串或 24 个十六进制字符的字符串。或者捕获错误。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

您忘记了"new" 选项。 .find**Update() 方法默认关闭此功能,这与根方法 .findAndModfiy() 的行为相同:

User.findByIdAndUpdate(
    req.params.userId, 
    { "$addToSet": {
      "user_favorites": req.params.objectId
    },
    { "upsert": true, "new": true },
    function(err, data){
        if (err) return res.status(500).send(err)

        res.status(200).send({'message':'saved'});
    }
)

所以文档实际上是在数据库中更新的,但是如果没有“新”,那么您会找到原始文档,而不是修改后的文档。

此外,无论您从哪个教程中学习,“安全”选项已被弃用很长时间。所有写入关注设置默认为已确认,这就是该设置应该表示的内容。

【讨论】:

  • 哇,你是对的。所有收藏夹都已保存。感谢您的帮助。
猜你喜欢
  • 2018-07-12
  • 2021-01-30
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 2017-06-09
  • 2018-07-08
  • 1970-01-01
  • 2020-07-27
相关资源
最近更新 更多