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函数的错误。

当更新一个Mixedtypes(这似乎是一个基本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