2013-02-11 101 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