【问题标题】:add new properties to object with variable name in mongoose在猫鼬中为具有变量名的对象添加新属性
【发布时间】:2015-09-05 12:56:56
【问题描述】:

我需要在 Mongo 中存储对问题的回答。我正在使用猫鼬。我的查询现在看起来像这样:

router.post('/answers', expressJwt({secret: config.secret}), function (req, res, next) {
    var user = req.user
    var question = req.body.question
    var answer = req.body.answers
    var id = question._id

    db.User.update({email: user.email}, {$set: {answers[question._id]: answer}}, function (err, doc) {
        if (err) {
            console.error('problem updating answers object', err)
            return res.json(err)
        }
        console.log(doc)
        return res.json('successfully updated answers')
    })
})

我收到一个错误“意外令牌 [”我如何向我的答案对象添加属性?

我必须调用数据库来获取答案对象,然后对其进行修改,然后将其更新回数据库。这是我使用的代码。注意:使用lea 和 exec 和 mongoose 来获取原始对象,否则你会遇到修改 mongoose 对象的问题。

router.post('/answers', expressJwt({secret: config.secret}), function (req, res, next) {
    var user = req.user
    var question = req.body.question
    var answer = req.body.answers
    var id = question._id

    db.User.findOne({email: user.email}).lean().exec(function (err, user) {
        user.answers[question._id] = answer
        db.User.update({email: user.email}, {$set: {answers: user.answers}}, function (err, doc) {
            if (err) {
            console.error('problem updating answers object', err)
            return res.json(err)
        }
            console.log(doc)
            return res.json('successfully updated answers')
        })
    })
})

【问题讨论】:

  • console.dir(answers[question._id]) 输出什么?
  • @mscdex 好吧,这取决于上下文,但在这种情况下什么都没有。我正在尝试向答案对象添加一个新属性,该属性是正在回答的问题的 id:答案数组。如果您从数据库中检索用户并访问此答案对象,则取决于他们是否回答了该特定问题。
  • 刚刚查看了console.dir() 属性将是 id : answers, id : answers 所有问题。

标签: node.js mongodb mongoose


【解决方案1】:

首先,您必须在调用数据库之前在您的答案对象中设置 id,然后用您的新字段替换您的字段

router.post('/answers', expressJwt({secret: config.secret}), function (req, res, next) {
    var user = req.user
    var question = req.body.question
    var answer = req.body.answers

    answer.question._id = question._id;

    db.User.update({email: user.email}, {$set: {answers: answer}}, function (err, doc) {
        if (err) {
            console.error('problem updating answers object', err)
            return res.json(err)
        }
        console.log(doc)
        return res.json('successfully updated answers')
    })
})

【讨论】:

  • 是的,这就是我所做的。它类似于您编写的内容,但需要额外调用 db 来获取 answers 对象。我会接受你的回答并用代码编辑我的问题。
【解决方案2】:

将其存储在变量中,而不是使用文字对象语法:

var $set = {};
$set[answers[question._id]] = answer;
db.User.update({email: user.email}, {$set: $set}, function (err, doc) {
// ...

此外,如果您有可用的 ES6 功能(例如,最新版本的 io.js),您可以在对象文字中使用 special bracket notation 来实现相同的目的:

db.User.update({email: user.email}, {$set: {[answers[question._id]]: answer}}, function (err, doc) {
// ...

【讨论】:

  • $set 方法给我一个 500 内部服务器错误,而第二种方法继续给我 'unexpected token [' 并使服务器崩溃
  • 我也试过 findOneAndUpdate 和 upsert: true 如其他 SO 帖子中所述,但没有运气。我已经用我正在研究的完整路线更新了我的帖子。
  • 我不能拥有 ES6 功能,因为 500 错误来自 $set[answers...] = answers 行。
猜你喜欢
  • 2016-03-20
  • 2021-06-07
  • 1970-01-01
  • 2012-11-02
  • 2018-06-12
  • 2017-10-23
  • 2021-10-02
  • 1970-01-01
  • 2014-05-08
相关资源
最近更新 更多