mongooseembedded式文件更新
我有一个embedded式文件更新的问题。
我定义的模式:
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来完成这项工作:
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')
,但count的值没有改变。
当我做了一些console.log
我看到它改变了值,但talk.save
只是不保存在数据库中。
此外,我很不满周期只是findembedded式文档的_id
。 在mongoose的文档中,我读到了关于talk.vote.id(my_id)
但是这给了我没有一个id
函数的错误。
当更新一个Mixed
types(这似乎是一个基本types,所以也包括embedded式文件),必须调用.markModified
文件。 在这种情况下,这将是:
talk.markModified("vote"); // mention that `talk.vote` has been modified talk.save(function(err) { // ... });
希望这有助于未来的人,因为我很快找不到答案。
参考:
Mongoose失去了自动检测/保存这些变化的能力。 为了“告诉”Mongoose混合types的值已经改变,调用文档的
.markModified(path)
方法,将path传递给你刚才改变的混合types。
这是因为你正在试图保存你的谈话对象之前的增量计数已被解雇的callback。 另外,你确定实例化你的谈话模式? 例如:
var talk = new Talk();
然而,如果你想要做的只是增加你的countvariables,mongo支持你可能会觉得有用的atomic原地更新:
talk.find( { _id : req.body.vote }, { $inc: { count : 1 } } );
看看: http : //www.mongodb.org/display/DOCS/Updating#Updating-%24inc