使用猫鼬更新子文档

Updating a subdocument with Mongoose

本文关键字:文档 更新      更新时间:2023-09-26

我正在构建一个简单的民意调查应用程序,其中包含角度,快速和猫鼬。

我的数据如下所示:'

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 参数中发送 Poll ID,在响应正文中发送响应 ID。我能够安慰.log投票值,但我不知道如何编写查询。谁能帮忙?

谢谢!

您可以使用

$inc运算符。请参阅文档。

Polls.findOneAndUpdate({
        _id: req.params.id,
        responses._id: req.body._id
    }, {
        {$inc: {'responses.$.votes': 1}}
    });

找到了一个解决方案:基本上只需使用 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();
    })
})