Создание вложенных документов в Mongoose с помощью вложенной схемы

У меня есть пользовательская схема, которая включает вложенные схемы - всего три уровня глубины. У меня нет проблем с добавлением в опросы, но я не могу добавлять входы на всю жизнь. Я попытался заставить пользователя обрабатывать данные, как обычные json (например, получить индекс массива опросов, а затем нажать на вложенный входной массив). Я попытался создать новый вход и поместить его в массив входов.

Следующий код отлично работает для создания нового опроса для данного пользователя:

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

Из контроллеров.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 });
        });;
});

person wlh    schedule 18.10.2017    source источник
comment
Недавно я столкнулся с похожей проблемой. Пробовали ли вы добавить следующее: user.markModified(опросы)   -  person danielm    schedule 19.10.2017
comment
@danielm Спасибо. Это работало просто отлично, конечно, когда опросы были строкой - user.markModified('polls'). Разочаровывающим аспектом этого является различие в методах сохранения записей для одного вложенного документа по сравнению с другим, но, возможно, это было неизбежно.   -  person wlh    schedule 19.10.2017
comment
Я добавил свой комментарий в качестве ответа   -  person danielm    schedule 19.10.2017


Ответы (1)


Mongoose не может отслеживать такие изменения в подобъектах, поэтому поле должно быть явно помечено как требующее обновления:

user.markModified('polls')
person danielm    schedule 19.10.2017