使用嵌套架构在 Mongoose 中创建子子文档
Create subsubdocs in Mongoose with Nested Schema
我有一个包含嵌套架构的用户架构 - 总共三层。我可以毫无问题地添加到民意调查,但无法为我的生活添加输入。我试图让用户像常规 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 });
});;
});
Mongoose 无法像这样跟踪子对象中的更改,因此必须明确标记该字段需要像这样更新:
user.markModified('polls')
我有一个包含嵌套架构的用户架构 - 总共三层。我可以毫无问题地添加到民意调查,但无法为我的生活添加输入。我试图让用户像常规 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 });
});;
});
Mongoose 无法像这样跟踪子对象中的更改,因此必须明确标记该字段需要像这样更新:
user.markModified('polls')