如何在mongodb中比较两个不同集合中的两个字段?

时间:2016-11-10 04:13:57

标签: mongodb

我是MongoDB的初学者。 现在,我正在使用mongo进行一个查询。请看这个,让我知道是否可能?如果有可能,我该怎么办?

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}
        ]
    }

1 个答案:

答案 0 :(得分:1)

不确定isRoom属性,但要跨群集执行联接,您有两个基本选项:

  • 使用多个查询自行编码
  • 将汇总管道与$lookup运营商
  • 一起使用

作为$lookup的一个简单示例,您可以占用一个给定的房间,展开其students数组(意味着将每个学生元素分离到自己的实体中),然后查找相应的学生ID在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