Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Mongoose更新子文档_Javascript_Angularjs_Mongodb_Express_Mongoose - Fatal编程技术网

Javascript 使用Mongoose更新子文档

Javascript 使用Mongoose更新子文档,javascript,angularjs,mongodb,express,mongoose,Javascript,Angularjs,Mongodb,Express,Mongoose,我正在用angular、express和mongoose构建一个简单的民意调查应用程序 我的数据如下所示:` var mongoose = require('mongoose'); var responseSchema = new mongoose.Schema({ responseText: String, votes: { type: Number, default: 0 } }) module.exports = mongoose.

我正在用angular、express和mongoose构建一个简单的民意调查应用程序

我的数据如下所示:`

var mongoose = require('mongoose');

var responseSchema = new mongoose.Schema({
    responseText: String,
    votes: {
        type: Number,
        default: 0
    }
})
module.exports = mongoose.model('Responses', responseSchema);

var pollsSchema = new mongoose.Schema({
    question: String,
    responses: [responseSchema]
})

module.exports = mongoose.model('Polls', pollsSchema);`
所以,我有一个民意测验模型,其中包含一个子文档响应模型

当有人投票时,我想增加回应的票数。 这是我正在处理的查询,但它不正确

router.post('/api/polls/:id/vote', function (req, res, next) {

    console.log("Poll ID : " + req.params.id);
    console.log("Option ID : " + req.body._id);
    Polls.findOneAndUpdate({
        _id: req.params.id
    }, {

        $inc: {
            'responses.id(req.body.id).votes': 1
        }

    }, function (err, post) {

        if (err) return next(err);
        console.log(err);
        console.log(post);
        console.log(post.responses.id(req.body._id).votes);
    });
})
编辑:更新

基本上,我在req参数中发送轮询ID,在响应体中发送响应ID。我能够console.log投票值,但我不知道如何编写查询。有人能帮忙吗


谢谢

您可以使用
$inc
操作符。看


找到了一个解决方案:基本上只需使用findOne缩小id范围,然后在回调中执行查询。看起来有点奇怪,但它起作用了。如果其他人有更好的办法,我很乐意听。谢谢

router.post('/api/polls/:id/vote', function (req, res, next) {

    Polls.findOne({
        _id: req.params.id
    }, 'responses', function (err, post) {
        post.responses.id(req.body._id).votes++;
        post.save();
    })
})

谢谢我确实试过了,不幸的是,它似乎没有增加。有没有办法调试出不起作用的东西?这看起来确实像我想要做的。err为null,post似乎返回整个对象(id、question、responses[])。我将用更新的代码更新原始帖子。使用findOne找到了一个解决方案,谢谢您的帮助。我把它贴在下面。
router.post('/api/polls/:id/vote', function (req, res, next) {

    Polls.findOne({
        _id: req.params.id
    }, 'responses', function (err, post) {
        post.responses.id(req.body._id).votes++;
        post.save();
    })
})