当前位置:  开发笔记 > 编程语言 > 正文

Mongoose嵌入式文档更新

如何解决《Mongoose嵌入式文档更新》经验,为你挑选了1个好方法。

我有嵌入式文档更新的问题.

我定义的架构:

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++用给定的Talkid和VoteOptionid 更新.我有以下功能来完成这项工作:

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只是没有将它保存在db中.

此外,我对于查找_id嵌入式文档的周期非常不满意.在我读过的mongoose文档中,talk.vote.id(my_id)但这给了我一个没有id函数的错误.



1> pimvdb..:

更新Mixed类型(似乎不是基本类型,因此也包括嵌入文档)时,必须调用.markModified文档.在这种情况下,它将是:

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

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

希望这有助于未来的人,因为我很快找不到答案.


参考:

...... Mongoose失去了自动检测/保存这些变化的能力.要"告诉"Mongoose混合类型的值已更改,请调用.markModified(path)文档的方法将路径传递给刚刚更改的混合类型.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有