首页 > 解决方案 > 如何在nodejs for mongodb中为te以下上下文编写聚合查询

问题描述

我想编写一个查询来从 mongodb 中获取数据,我有三个集合——书籍、教师、学生。图书收藏有bookName 和_id,教师收藏有--teacherName 和teacherId,学生收藏有_id、studentName、teacherId……。我有studentName作为S1,teacherName作为T1,我怎样才能从学生集合中获取名称为S1的学生记录,其中teacherId作为名称T1(来自教师集合)......例如,我需要从书籍集合以及我必须申请的教师和学生中获取具有名称的书籍_id,从studentName = S1和teacherId =(select techer ID from techer where teacherName = T1)中选择_id ...我如何在节点中编写此查询使用聚合——下面是我的代码,有人可以帮我更正我的代码

books.aggregate([{
  '$match': {
    'name': 'book1'
  }
}, {
  '$lookup': {
    {
      from: students,
      '$match': {

        'name': 'Annie'
      }
    },
    'from': 'teachers', // collection name of the teachers
    'localField': 'teacherId',
    'foreignField': '_id',
    'as': 'teachers'
  }
}, {
  '$match': {
    'teachers': {
      '$elemMatch': {
        'teacherName': 'Jones'
      }
    }
  }
}])

例如..

books 
ID1, physics
ID2, chemistry

tecaher 
t1, zed
t2, tom

student 
s1, annie, zed(//teacher name)
s2, john, zed
s3, leya, tom

我已经插入了书籍和教师收藏,现在我必须获取学生记录,它的名称为 s1,teacherid 作为教师收藏的 zed id,但需要 techer 收藏中 techer Zed 的 id 和 id来自书籍收藏的物理书......所以我开始喜欢books.agregate(匹配书名)然后查找学生 - 但学生只有老师的名字,我必须从老师收藏中找到老师ID......我必须在学生记录中插入 id、name、teacherid

标签: node.jsmongodb

解决方案


$lookup以错误的方式使用运算符,请参阅此处以获取更多信息和示例。

以下查询将对您有所帮助:

db.student.aggregate([
  {
    $lookup: {
      from: "teacher",
      localField: "teacher_name",
      foreignField: "name",
      as: "teacher_details"
    }
  },
  {
    $unwind: "$teacher_details"
  },
  {
    $project: {
      name: 1,
      teacher_id: "$teacher_details._id"
    }
  }
])

输出:

[
  {
    "_id": "s1",
    "name": "annie",
    "teacher_id": "t1"
  },
  {
    "_id": "s2",
    "name": "john",
    "teacher_id": "t1"
  },
  {
    "_id": "s3",
    "name": "leya",
    "teacher_id": "t2"
  }
]

推荐阅读