繁体   English   中英

MongoDB深度嵌套

[英]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。

猫鼬的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的填充

希望这会有所帮助..谢谢

您需要通过以下方式访问它们:

  1. lessons.lessonTitle
  2. lessons.questions.questionUser
  3. lessons.questions.answers.answerUser
  4. lessons.questions.answers.comment.commentUser

只需在与示例相同的级别上修改其他键的最后一个键名即可。


MongoDB对更新嵌套数组的支持很差。 因此,如果需要频繁更新数据并考虑使用多个集合,则最好避免使用它们。 但是,对此也有争论。 您可以阅读更多关于“ 嵌入与参考”的信息,并确定最适合您的需求的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM