当前位置: 首页 > 知识库问答 >
问题:

如何在MongoDB中的两个不同集合中进行查询?(不使用ORM)

康锦
2023-03-14

学生拥有诸如

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

并且有这样的文档

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

还有一个名为“学生-课程”的第三个集合,我在那里保存了学生的id和他们相应的课程id。像这样

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

共有1个答案

况谦
2023-03-14

需要将$loopup与管道一起使用,

  • 第一$按student_id分组,因为我们要获取学生的课程,$pushcourse_id中的所有course_id,以便下一步查找
db.StudentCourses.aggregate([
  {
    $group: {
      _id: "$student_id",
      course_ids: {
        $push: "$course_id"
      }
    }
  },
  • $查找学生集合,并在Student
  • 中获取学生详细信息
  • $unwindstudent,因为它是一个数组,我们只需要一个来自同一学生记录组的数组
  • $project必填字段
  {
    $lookup: {
      from: "Student",
      localField: "_id",
      foreignField: "id",
      as: "student"
    }
  },
  {
    $unwind: "$student"
  },
  {
    $project: {
      id: "$_id",
      name: "$student.name",
      course_ids: 1
    }
  },
  • $查找课程集合,并获取包含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

 类似资料:
  • 我正在使用MongoDB,我最终得到了两个集合(无意中)。 第一次收集(样本)有1亿条记录(推文),结构如下: 第二个集合(用户)拥有来自tweet集合的3000万条独特用户记录,看起来是这样的 用户集合中的_id是来自推文集合的user.screen_name,目标是他们的状态(是否作弊用户),最后value.count是我们第一个集合(样本)集合中出现的用户数量(例如捕获的推文数量) 现在我想

  • 问题内容: 假设我有两个类CLassA和CLassB。它们有一个共同的属性,例如每个类拥有的元素数量。 我如何从ClassA和CLassB的对象创建一个集合,并按该属性排序(降序升序无所谓)? 我收集了一个类型,但是当我尝试实现Comparable Interface时,我无法使用该方法(例如,获取返回元素nr的get)。 我有什么解决方案? 谢谢你的帮助! 问题答案: 实际上,如果要将它们放在同

  • 问题内容: 我有一个包含多个文档的mongo集合,假设以下内容(假设出于任何原因,汤姆在2012年都有两名历史老师) 我希望能够查询“汤姆”曾经有过的所有不同的班级,即使汤姆有多个“历史”班级且有多个老师,我只想查询得到最少数量的文档,以便汤姆在所有这些都将显示一次,而“历史记录”只显示一次,而不是查询结果包含重复“历史记录”的多个文档。 我看了一下:http : //mongoengine- o

  • 我有一个画廊的以下文件(Json), 现在我还有一个颜色集合,比如colors-collection:[“黑色”、“黄色”、“红色”、“绿色”、“蓝色”、“粉色”] 我想通过与提供的文本匹配的名称获取绘画,比如“蒙娜丽莎”(作为搜索查询),我还想将两种颜色与colors-collection进行比较,如果colors-collection中有任何匹配的颜色,那么它应该返回绘画<我想要下面这样的东西

  • 以这个结构为例: 我想执行一个查询,首先验证用户()是否等于参考值。如果是,我希望它验证数组()是否包含某个标记。 这是我到目前为止能找到的最接近的东西: 此代码是为在Firebase上部署函数开发的,每当我拥有的某个集合上出现onWrite事件时,它就会触发。 此外,如果有人知道一些关于Firestore的复合查询的好例子,我将不胜感激。我已经阅读了文档,并看到了Firebase团队解释Fire

  • 我需要分离读/写PostgreSQL实例。我有一个写复制副本和几个读复制副本。 QUKUS支持添加多个数据源,但尚不清楚如何让Panache/HiberNate为不同的查询选择合适的数据源。 问:如何配置 Quarkus 以使用不同的数据源进行读/写访问?