如您所见,我有两个名为School
和Student
的课程。我想搜索“学校名称是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
}
答案 0 :(得分:8)
MongoDB不是关系数据库。它不支持连接。要模拟连接,您必须查询第一个集合,获取结果,然后使用填充了第一个查询返回的文档的适用键值的大$in
查询来查询第二个集合。这听起来既缓慢又丑陋,因此应该设计数据库模式以避免它。
对于您的示例,我会将学校名称添加到Student
文档中。这样就可以通过单个查询来满足您的两种用例。
任何来自关系数据库背景的人现在会说“但这是一种冗余!你违反了第二种正常形式!”。这是事实,但规范化是特定于关系数据库的设计模式。它不一定适用于面向文档的数据库。那么哪些设计模式适用于面向文档的数据库?艰难的电话。这是一项新技术。我们仍然在想这个。