【发布时间】:2017-06-10 19:55:51
【问题描述】:
我在 MongoDB 中使用深度嵌套的数组时遇到了一些困难。我正在使用猫鼬,我的项目由当前所有使用相同数据库集合的微服务组成。是否可以将下面的示例用于嵌套的深度?如果是这样,如何访问"questionUser"、"questionTitle" 或"questionContent"。我目前可以添加课程和课程标题。当我尝试添加问题数据时,正确的路由器被击中,但它只是挂起并超时,并且通过的所有数据都是 null。
我已经压缩了下面的数据示例。我正在使用 MEAN 堆栈。我也没有看到任何错误,它只是挂起。不知道从哪里或如何开始对此进行故障排除。我不反对重新设计我的数据库,但想以某种方式保持嵌套/嵌入式结构,但需要一些关于如何更改它的指导。
数据库
{
"_id": "593bc9fbbc083a8200eb9b36",
"courseTitle": "Course 101",
"courseActive": true,
"lessons": [
{
"lessonTitle": "Lesson about widgets",
"_id": "593bcecc0799cd89a87ce53e",
"lessonActive": true,
"questions": [
{
"questionUser": "user1",
"_id" : "dadsfjlkj23o21",
"questionTitle": "title",
"questionContent": "stuffff",
"answers" : [
{
"answerUser": "user2",
"_id": "asdfk231191837d",
"answerContent": "the answer is simple",
"comment": [
{
"commentUser": "user1",
"_id": "asdkjfawow8183",
"commentBody": "That makes sense, thanks!"
}
]
}
]
}
]
}
]
}
路由器
/*
* create new course
*/
router.post('/', (req, res) => {
let course = new Course();
course.courseTitle = req.body.courseTitle;
course.courseActive = req.body.courseActive;
course.save().then((saveCourse) => res.json(saveCourse))
.catch((err) => console.log(err));
});
/*
* create new lesson
*/
router.post('/:id', (req, res) => {
Course.findOne({_id: req.params.id}).then((foundCourse) => {
foundCourse.lessons = req.body.lessons;
foundCourse.save().then((savedCourse) => res.json(savedCourse))
.catch((err) => console.log(err));
})
});
/*
* create new question
*/
router.post('/:id/lessons/:lessonid', (req, res) => {
Lesson.findOne({_id: req.params.id}).then((foundLesson) => {
foundLesson.questions = req.body.questions;
foundLesson.save().then((savedLesson) => res.json(savedLesson))
.catch((err) => console.log(err));
})
});
app.ts
import courses from './api/courses';
app.use('/api/v2/courses', courses);
import lessons from './api/lessons';
app.use('/api/v2/lessons', lessons);
import questions from './api/questions';
app.use('/api/v2/questions', questions);
【问题讨论】:
-
你可能应该展示你用来访问这个结构的代码,因为结构本身并没有告诉我们它为什么挂起。也就是说,你真的应该在 Mongoose 文档中查看
populate,因为我认为你在使用这个模式时犯了一个错误。其中一些东西应该有自己的集合,并通过引用相互关联。 -
@Paul 我将编辑和更新帖子,谢谢...我原本不想在帖子中放置太多信息,而且看起来很混乱。我会在更新帖子后立即查看
populate。谢谢! -
每当有人一味地提到填充时,我要求考虑你真正想要实现的目标Mongoose populate vs object nesting
-
我的目标是有一个论坛(这只是为了练习),它有一个课程登陆页面,用户点击一个课程,这将把他们带到课程,课程到问题,问题到答案和 cmets。类似于堆栈溢出,只是在问题之前有一个课程和课程页面。如果课程或课程被删除,我希望删除任何内容中的所有数据。我在想 mongodb 是最好的,但我无法访问深度嵌套的数据。当它被引用时,我不知道如何删除被删除项目引用的数据。
标签: node.js mongodb express mongoose