Mongoid:Return 与关系相关的文件?

Mongoid: Return documents related to relation?

假设我正在为学生、课程和教师建模。给定一个学生注册了很多课程,我如何找到 类 的所有 102 级教师?就此而言,我如何找到他们所有课程的老师?现在,我有这个:

s = Mongoid::Student.find_by(name: 'Billy')
l = s.lessons.where(level: 102)
t = l.map { |lesson| lesson.teachers }.flatten

有没有办法将后两行变成一个查询?

每个集合都需要至少一个查询,无法在一个查询中访问多个集合(即没有 JOIN),因此您只能这样做。然而,这:

t = l.map { |lesson| lesson.teachers }.flatten

正在执行 l.length 查询以获取每节课的教师。您可以通过收集课程中的所有教师 ID 来清理它:

teacher_ids = l.map(&:teacher_ids).flatten.uniq # Or use `inject` or ...

然后根据这些 ID 抓取教师:

t = Teacher.find(teacher_ids)
# or
t = Teacher.where(:id.in => teacher_ids).to_a

如果所有这些查询都不适合您,那么您只能对某些内容进行非规范化,以便将所需的一切嵌入到一个集合中;这当然意味着您必须在事情发生变化时维护副本,并定期检查副本是否存在一致性问题。