【问题标题】:How to make a query in two different collections in mongoDB? (without using ORM)如何在 mongoDB 的两个不同集合中进行查询? (不使用 ORM)
【发布时间】:2020-11-17 23:30:05
【问题描述】:

假设,在 MongoDB 中我有两个集合。一个是“学生”,另一个是“课程”。

学生有文件如

{"id":"1","name":"Alex"},.. 

课程有文件如

{"course_id":"111","course_name":"React"},.. 

还有一个名为“students-courses”的第三个集合,其中我保存了学生的 ID 和相应的课程 ID。像这样

{"student_id":"1","course_id":"111"}

我想对学生的id 进行查询,以便它给出他/她注册的课程的输出。像这样

{
  "id": "1", 
  "name":"Alex",
  "taken_courses": [
    {"course_id":"111","course_name":"React"}, 
    {"course_id":"112","course_name":"Vue"}
  ]
} 

在不使用 ORM 的情况下,它将在 MongoDB 中建立多对多关系。如何进行此查询?

【问题讨论】:

  • 学生和课程的关系存储在哪里?您需要将一组课程 ID 存储在学生身上或以其他方式存储。
  • 我只想在 GUI(例如 Studio 3T)中做所有这些事情来进行这个查询...@Kevin Smith
  • @NayeemAhmed:凯文问的是:你怎么知道哪些学生选修了哪些课程?您需要将此信息存储在某处。您不存储此信息吗?
  • 我制作了另一个名为“Students-courses”的第三个集合,我将学生的 ID 与他们对应的注册课程 ID @Sergio 保存在一起
  • 这是通过聚合管道完成的。

标签: mongodb


【解决方案1】:

需要在管道中使用$loopup,

  • 第一个 $group by student_id 因为我们要获取学生的课程,$push all course_id in course_ids 用于下一步 - 查找目的
db.StudentCourses.aggregate([
  {
    $group: {
      _id: "$student_id",
      course_ids: {
        $push: "$course_id"
      }
    }
  },
  • $lookup 带有学生收藏并在student 中获取学生详细信息
  • $unwind student 因为它是一个数组,我们只需要一组相同学生记录中的一个
  • $project 必填字段
  {
    $lookup: {
      from: "Student",
      localField: "_id",
      foreignField: "id",
      as: "student"
    }
  },
  {
    $unwind: "$student"
  },
  {
    $project: {
      id: "$_id",
      name: "$student.name",
      course_ids: 1
    }
  },
  • $lookup Course Collection 获取包含course_ids的所有课程,我们在上面的$group中准备好了
  • $project 必填字段
  • 课程详情将存储在taken_courses
  {
    $lookup: {
      from: "Course",
      let: {
        cId: "$course_ids"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$course_id",
                "$$cId"
              ]
            }
          }
        },
        {
          $project: {
            _id: 0
          }
        }
      ],
      as: "taken_courses"
    }
  },
  • $project 详细信息,删除了非必填字段
  {
    $project: {
      _id: 0,
      course_ids: 0
    }
  }
])

工作场所:https://mongoplayground.net/p/FMZgkyKHPEe

有关语法和用法的更多详细信息,请查看aggregation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2016-09-27
    • 2012-05-11
    • 2020-05-31
    相关资源
    最近更新 更多