[英]MongoDB Deeply Nested
我在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));
})
});
应用程序
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);
绝对有几种方法可以对这种嵌套的MODEL进行操作。
为查找文件猫鼬提供了POPULATE方案和更好的事件聚集。
创建文档时,我认为不会有问题。 更新文档时,您需要子和子子文档的_id。
Model.findOneById("").then((data) => {
if (!data) return res.status(401).json({ "err": "not found" });
var lesson = data.lessons.id("lessionId");
if (!lesson) return res.status(401).json({ "err": "not found!!" });
var question = lession.id("QustionId");
if (!question) return res.status(401).json({ "err": "not found!!" });
var answer = answer.id("AnswerId");
if (!answer ) return res.status(401).json({ "err": "not found!!" });
var comment = answer.id("commentId");
if (!comment ) return res.status(401).json({ "err": "not found!!" });
comment.commentUser: "user1",
comment.commentBody: "That makes sense, thanks!"
data.save().then((success) => {
return res.status(200).json("success");
}).catch((err) => {
return res.status(500).json(err);
});
}).catch((err) => {
return res.status(500).jsonp(err);
});
1.)效果很好,但是也会降低性能,因为它会提取整个文档,然后将其重写,因此最好不要使用此类操作; 2。)还请记住16MB的限制/文档
还有其他方法可以提高性能==>参考模型
您可以将模型从一个集合设计为两个,或者在参考系统中可以是三个模型,并且可以将聚合功能用于参考系统。mongodb的Aggrigation文档 ,Mongoose的填充
希望这会有所帮助..谢谢
您需要通过以下方式访问它们:
lessons.lessonTitle
lessons.questions.questionUser
lessons.questions.answers.answerUser
lessons.questions.answers.comment.commentUser
只需在与示例相同的级别上修改其他键的最后一个键名即可。
MongoDB对更新嵌套数组的支持很差。 因此,如果需要频繁更新数据并考虑使用多个集合,则最好避免使用它们。 但是,对此也有争论。 您可以阅读更多关于“ 嵌入与参考”的信息,并确定最适合您的需求的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.