【问题标题】:Create subsubdocs in Mongoose with Nested Schema使用嵌套模式在 Mongoose 中创建子文档
【发布时间】:2018-03-30 21:22:24
【问题描述】:

我有一个包含嵌套模式的用户模式 ​​- 总共三层。我添加到民意调查没有问题,但无法为我的一生添加输入。我试图让用户像普通的json 一样处理数据(例如获取 polls 数组的索引,然后推送到嵌套的输入数组)。我尝试创建一个新输入并将其推送到输入数组。

以下代码非常适合为给定用户创建新投票:

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

但是,当我在民意调查中尝试相同的方法时,我无法保存到数据库。

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

我来回尝试了几件事,但鉴于我当前的数据结构,我似乎无法让它发挥作用。我已经阅读了关于 SO 以及其他在线资源的几篇文章,但大多数都给出了第一个嵌入式子文档的示例,而不是子文档的子文档。您能提供的任何帮助将不胜感激。谢谢。我正在考虑在这个项目中取消 Mongoose,只使用 mongodb 包来更清晰地控制我的数据正在发生的事情。

这是我当前的代码:

来自 User.js

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);

来自 controllers.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 });
        });;
});

【问题讨论】:

  • 我最近遇到了类似的问题。您是否尝试过添加以下内容:user.markModified(polls)
  • @danielm 谢谢。这工作得很好,当然当民意调查是一个字符串时 - user.markModified('polls')。令人沮丧的是,一个子文档与另一个子文档的记录保存方法不同,但也许这是不可避免的。
  • 我添加了我的评论作为答案

标签: node.js mongodb mongoose mongoose-schema


【解决方案1】:

Mongoose 无法像这样跟踪子对象中的更改,因此必须将字段明确标记为需要更新,如下所示:

user.markModified('polls')

【讨论】:

    猜你喜欢
    • 2017-06-22
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2018-09-04
    • 2020-10-04
    • 2017-04-01
    相关资源
    最近更新 更多