我有嵌入式文档更新的问题.
我定义的架构:
var Talk = new Schema({ title: { type: String, required: true }, content: { type: String, required: true }, date: { type: Date, required: true }, comments: { type: [Comments], required: false }, vote: { type: [VoteOptions], required: false }, }); var VoteOptions = new Schema({ option: { type: String, required: true }, count: { type: Number, required: false } });
现在我想vote.count++
用给定的Talk
id和VoteOption
id 更新.我有以下功能来完成这项工作:
function makeVote(req, res) { Talk.findOne(req.params.id, function(err, talk) { for (var i = 0; i < talk.vote.length; i++) { if (talk.vote[i]._id == req.body.vote) { talk.vote[i].count++; } } talk.save(function(err) { if (err) { req.flash('error', 'Error: ' + err); res.send('false'); } else { res.send('true'); } }); }); }
一切都在执行,我回来了res.send('true')
,但是计数值并没有改变.
当我做了一些时,console.log
我看到它改变了值,但是talk.save
只是没有将它保存在db中.
此外,我对于查找_id
嵌入式文档的周期非常不满意.在我读过的mongoose文档中,talk.vote.id(my_id)
但这给了我一个没有id
函数的错误.
更新Mixed
类型(似乎不是基本类型,因此也包括嵌入文档)时,必须调用.markModified
文档.在这种情况下,它将是:
talk.markModified("vote"); // mention that `talk.vote` has been modified talk.save(function(err) { // ... });
希望这有助于未来的人,因为我很快找不到答案.
参考:
...... Mongoose失去了自动检测/保存这些变化的能力.要"告诉"Mongoose混合类型的值已更改,请调用
.markModified(path)
文档的方法将路径传递给刚刚更改的混合类型.