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