2011-11-03 113 views
10

我有嵌入式文檔更新的問題。Mongoose嵌入式文檔更新

我定義的模式:

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只是不保存在數據庫中。

此外,我很不滿意的週期只是找到_id嵌入式文檔。在貓鼬的文檔中,我讀到了關於talk.vote.id(my_id),但是這給我錯誤沒有id函數。

回答

19

當更新Mixed類型(它似乎是除基本類型以外還包含嵌入文檔)時,必須在文檔上調用.markModified。在這種情況下,這將是:

talk.markModified("vote"); // mention that `talk.vote` has been modified 

talk.save(function(err) { 
    // ... 
}); 

希望這可以幫助別人的未來,因爲我無法找到答案非常快。


Reference:

...貓鼬失去了自動檢測/保存這些變化的能力。要「告訴」貓鼬混合類型的值已更改,請調用文檔的.markModified(path)方法,將該路徑傳遞給剛剛更改的混合類型。

+0

今日英雄! – MrBr

0

這是因爲您正試圖在增加計數已被觸發的回調之前保存通話對象。另外,你是否確定實例化Talk模式?例如:

var talk = new Talk(); 

但是,如果你想要做的就是增加你的計數變量,蒙戈支持原子,就地更新,這可能對您有用:

talk.find({ _id : req.body.vote }, { $inc: { count : 1 } }); 

看看: http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc