代码之家  ›  专栏  ›  技术社区  ›  wlh

使用嵌套模式在Mongoose中创建子文档

  •  0
  • wlh  · 技术社区  · 8 年前

    json (例如获取轮询数组的索引,然后推送到嵌套的输入数组)。我尝试创建一个新的输入并将其推送到输入数组。

    以下代码非常适用于在给定用户上创建新投票:

    const poll = user.polls.create({});
    user.polls.push(poll);
    user.save(function(err, data) {
       //more stuff here
    })
    

    然而,当我在投票中尝试相同的方法时,我无法保存到DB。

    const poll = user.polls.id(<some _id>);
    const input = poll.create({}); // or user.polls.id(<some _id>).create({});
    poll.inputs.push(input);
    

    我反复尝试了几件事,但鉴于我目前的数据结构,似乎无法实现这一点。我已经阅读了一些关于SO以及其他在线来源的帖子,但大多数都给出了第一个嵌入子文档的示例,而不是子文档的子文档。如果您能提供任何帮助,我们将不胜感激。谢谢我正在考虑在这个项目中放弃猫鼬,只使用 mongodb 软件包可以更清晰地控制我的数据。

    这是我当前的代码:

    const InputSchema = new Schema({
        [ALL SORTS OF VARIOUS DATA HERE] 
    });
    
    const PollSchema = new Schema({
        inputs: [InputSchema],
    });
    
    const UserSchema = new Schema({
        polls: [PollSchema]
    });
    
    module.exports = mongoose.model('User', UserSchema);
    

    来自控制器。js公司

    const User = require('../models/User');
    
    router.post('/polls/inputs/add/:creatorId', function(req, res) {
        let title = req.body.option.title,
            order = req.body.option.order,
            voters= [];
    
        User.findOne({ creatorId: req.params.creatorId })
            .then(user => {
    
                const input = {order, title, voters};
    
                user.polls.id(req.body.pollId).inputs.push(input);
    
                user.save(function(err, data) {
                    if (err) {
                        res.statusCode = 500;
                        return res.json({ title: 'Save Error', message: err });
                    }
                    console.log('Success!');
                    res.json({ input: input });
                });
            }).catch(err => {
                res.statusCode = 500;
                return res.json({ title: 'DB Error', message: err });
            });;
    });
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   danielm    8 年前

    Mongoose无法像这样跟踪子对象中的更改,因此必须明确地标记字段,以便像这样更新:

    user.markModified('polls')