[英]Mongoose embedded document updating
我有嵌入式文檔更新的問題。
我定義的架構:
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
}
});
現在我想用給定的Talk
id和VoteOption
id更新vote.count++
。 我有以下功能來完成這項工作:
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
只是沒有將它保存在db中。
另外,我非常不滿意這個循環只是為了找到嵌入式文檔的_id
。 在talk.vote.id(my_id)
文檔中,我讀到了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)
方法,將路徑傳遞給剛剛更改的Mixed類型。
這是因為你試圖在回調之前保存你的談話對象,其中已經觸發了增量計數。 另外,您確定要實例化您的Talk模式嗎? 例如:
var talk = new Talk();
但是,如果您只想增加計數變量,mongo支持原子,就地更新,您可能會發現這些更新很有用:
talk.find( { _id : req.body.vote }, { $inc: { count : 1 } } );
看看: http : //www.mongodb.org/display/DOCS/Updating#Updating-%24inc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.