【问题标题】:What is the best practice for joins in MongoDB?在 MongoDB 中连接的最佳实践是什么?
【发布时间】:2013-07-07 20:50:30
【问题描述】:

如您所见,我有两个班级,分别称为 SchoolStudent。我想搜索“学校名称为 bla bla bla 的学生”和“拥有 90 年级以上学生的学校”。我阅读了一些文件,但我有点困惑。

public class School extends BasicDBObject  {
  private int id;
  private String name;
  private String number;
  private List<Student> studentList = new ArrayList<Student>();,

  //getter and setters
}

public class Student extends BasicDBObject{
  private int id;
  private String name;
  private String grade;
  private School school;

  //getter and setters
}

【问题讨论】:

  • 根据我的小经验,我想说两者都需要您编写 map reduce 查询。第一个问题可以通过首先查询学校然后得到Student 列表来解决。
  • @Prinzhorn 我将查询并获取学校列表,然后对于每个学校 ID,我将搜索学生列表?如果我有 1000 所学校叫 bla bla bla,该怎么办?
  • MongoDb 中没有连接。但是,如果您在学校文档中有学生详细信息,则您的查询看起来不需要连接。向我们展示您尝试过的查询。按姓名搜索,然后在学生列表中搜索成绩 > 90。我总是发现使用 MongoDb 控制台构建示例文档最容易,然后在那里构建查询,然后根据需要将它们翻译成目标编程语言。
  • @WiredPrairie 我有近 100 节课。我无法为每种情况构建示例文档。我想为连接操作找到一个通用的解决方案,但我认为没有人对 mongodb 中的连接查询有任何想法。
  • @hellzone 我不了解 Java 驱动程序,但是使用 Mongoose (node.js) 您可以查询学校(一次往返),然后用另一次往返(一次请求)填充所有列表适用于所有学生)。 Java驱动程序不这样做吗(在查询School时填写studentList?)。

标签: mongodb mongodb-java nosql


【解决方案1】:

MongoDB 不是关系数据库。它不支持连接。要模拟连接,您必须查询第一个集合,获取结果,然后使用大型 $in 查询查询第二个集合,其中填充了第一个查询返回的文档的适用键值。这听起来既缓慢又丑陋,因此应该设计数据库架构来避免它。

对于您的示例,我会将学校名称添加到 Student 文档中。这将允许通过单个查询满足您的两个用例。

任何具有关系数据库背景的人现在都会说“但那是多余的!你违反了第二范式!”。没错,但规范化是一种特定于关系数据库的设计模式。它不一定适用于面向文档的数据库。那么哪些设计模式适用于面向文档的数据库呢?艰难的召唤。这是一项新技术。我们仍在解决这个问题。

【讨论】:

  • “对于您的示例,我会将学校名称添加到学生文档中。这将允许通过单个查询满足您的两个用例。”我什么都不懂。如果我想查询“学号为...的学生”,那么我将在Student文档中添加学号怎么办?
  • 正是重点!一般来说,对于 nosql db,您必须首先考虑您将执行哪种查询,然后再设计模式。与在 sql 世界中您设计的模式相反,该模式针对您将来会想到的每种查询进行规范化。
  • @ALoR 然后我会将所有学生字段(id、name、grade)添加到学校文档,并将所有学校字段(id、name、number)添加到学校文档。我有近 100 个课程,我会将所有其他 99 个课程字段(数千个字段)添加到学校文档中。我认为这里有问题。每个类可以有数百万行。
  • @hellzone 关于您的第一条评论:我理解您的问题,就像您想按学校名称搜索学生一样。当您想通过 schoon id 搜索它们时,您可以将学校 id 放入学生文档中。关于您的第二条评论:您真的需要查询所有这些字段吗?当您希望将来允许进行广泛的数据分析但您还不知道什么样的分析时,您应该使用关系数据库。
  • @hellzone 没有 NoSQL 这样的东西。当您真正的意思是“MongoDB 相对于关系数据库的主要观点是什么”时,它的优点包括更好的集群、更好的分片、对嵌套数据的支持以及它允许​​非同质数据(在同一集合中存储具有不同字段的文档)。但是,只要您尝试将 MongoDB 缩减为与关系数据库相同的功能子集,您就不会对它感到满意。
猜你喜欢
  • 2023-03-14
  • 2011-01-12
  • 2016-11-30
  • 2015-01-13
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多