在mongoose中使用变量名称向对象添加新属性

时间:2015-09-05 03:21:54

标签: node.js mongodb mongoose

我需要在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')
    })
})

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

我必须进行db调用以获取answers对象,然后修改它,然后将其更新回db。这是我使用的代码。注意:使用lean和exec与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')
        })
    })
})

2 个答案:

答案 0 :(得分:1)

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

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) {
// ...

答案 1 :(得分: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')
    })
})