2013-02-11 63 views
0

假设我有两个集合中的MongoDB的MongoDB数据库收集链接

学生:

{_id: 1, name: "sa", teachers:[1,2,3]} 
{_id: 2, name: "sb", teachers:[1,3]} 

教师:

{_id:1, name: "ta"} 
{_id:2, name: "tb"} 
{_id:3, name: "tc"} 

现在我想通过教师名学生收集查询。像这样:

db.students.find({'teachers.name':"ta"}).count() 

我读过某处可以链接收藏或嵌入它。有什么办法可以做到吗?我试过db.students.ensureIndex({'teachers':1})但它不起作用。我也认为它不应该工作。我会走出线索怎么做?

DUPLICATE:我知道有很多帖子有类似的标题,但我很困惑!

回答

1

您是否研究过如何使用MongoDB完成关系模型?

我不确定你为什么认为ensureindex会在这里为你做任何事情。没有办法“链接”集合,MongoDB是一个非关系数据库。也没有办法可以将查询定义为当前使用子选择单独查询两个集合。

与嵌入这里的主要问题是,你有一个多对多的关系:

  • 的学生有很多老师
  • 老师有很多学生

这可以创建一个unperformant在这里更新的场景。

最好的,现在,我的头的顶部是实际做JOIN客户端,像这样:

var teachers = []; 
db.teachers.find({'name':"ta"}).forEach(function(doc){ 
    teachers[teachers.legnth-1] = doc._id; 
}); 
db.students.find({teachers: {$in: teachers}}); 
+0

+1。教师= db.teachers.distinct(“_ id”,{'name':“ta”}); db.students.find({teachers:{$ in:teachers}});或许读取更好,并且更加带宽友好 – 2013-02-11 15:25:52