У меня есть пользовательская схема, которая включает вложенные схемы - всего три уровня глубины. У меня нет проблем с добавлением в опросы, но я не могу добавлять входы на всю жизнь. Я попытался заставить пользователя обрабатывать данные, как обычные 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 });
});;
});
user.markModified('polls')
. Разочаровывающим аспектом этого является различие в методах сохранения записей для одного вложенного документа по сравнению с другим, но, возможно, это было неизбежно. - person wlh   schedule 19.10.2017