簡體   English   中英

Mongoose嵌入式文檔更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM