2016-11-10 311 views
0

我是MongoDB的初學者。 現在,我正在使用mongo進行一個查詢。請看看這個,讓我知道這有可能嗎?如果可能的話,我該怎麼辦?如何比較mongodb中不同的兩個集合中的兩個字段?

collection:students 
[{id:a, name:a-name}, {id:b, name:b-name}, {id:c, name:c-name}] 

collection:school 
[{ 
    name:schoolA, 
    students:[a,b,c] 
}] 

collection:room 
[{ 
    name:roomA, 
    students:[c,a] 
}] 

爲roomA

{ 
     name:roomA, 
     students:[ 
      {id:a name:a-name isRoom:YES}, 
      {id:b name:b-name isRoom:NO}, 
      {id:c name:c-name isRoom:YES} 
     ] 
    } 
+0

您使用的是什麼版本的MongoDB? – Sanj

+0

我正在使用最新版本3.4 –

回答

0

不能確定isRoom財產,但執行跨集合聯接,你有兩個基本的選擇預期結果:

  • 代碼它自己,多個查詢
  • 使用聚合管道$lookup運算符

由於$lookup一個簡單的例子,你可以拿一個給定的房間,放鬆其students陣列(意爲分離出每個學生的元素到自己的實體),然後查找相應的學生證的student收藏。

假設有輕微的調整,以您的room收集文件:

[{ 
    name:"roomA", 
    students:[ {studentId: "c"}, {studentId: "a"}] 
}] 

喜歡的東西:

db.room.aggregate([ 
    { 
     $unwind: "$students" 
    }, 
    { 
     $lookup: 
     { 
      from: "students", 
      localField: "studentid", 
      foreignField: "id", 
      as: "classroomStudents" 
     } 
    }, 
    { 
     $project: 
      { _id: 0, name : 1 , classroomStudents : 1 } 
    } 

])

這將產生類似:

{ 
    name:"roomA", 
    classroomStudents: [ 
     {id:"a", name:"a-name"}, 
     {id:"c", name:"c-name"} 
    ] 
} 

聲明:我沒有真正運行這個聚合,所以可能會有一些小問題。只是試圖給你一個關於如何去解決這個問題的想法,$lookup

有關$lookup的更多信息是here

+0

謝謝您的最佳答案。那麼我將如何與學校收藏整合? –

+0

我不知道你想如何整合學校收藏。但是我清楚地向您展示瞭如何通過聚合管道和'$ lookup'在集合之間聚合文檔。在這一點上,你應該能夠弄清楚如何擴展這個例子。 –