как я могу написать запрос агрегирования для te ниже контекста в nodejs для mongodb - PullRequest
0 голосов
/ 27 мая 2020

Я хотел бы написать запрос для получения данных из mongodb, у меня есть три коллекции - книги, учителя, ученики. В коллекции книг есть bookName и_id, в коллекции учителей - teacherName и teacherId, в коллекции учеников _id, studentName, TeacherId…. У меня есть studentName как S1 и teacherName как T1 со мной, как я могу получить запись студента с именем S1, у которой также есть teacherId как имя T1 (из коллекции учителей) из коллекции студентов ... например, мне нужно получить книги _id с именем, указанным из коллекции книг, а также от учителей и учеников, которых я должен подать, выберите _id у ученика, где studentName = S1 и teacherId = (выберите techerID из techer, где teacherName = T1) ... как я могу написать этот запрос в узле с использованием агрегации - ниже мой код, может ли кто-нибудь помочь мне исправить мой код

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 из коллекции учителей, но нужен идентификатор techer Zed из коллекции techer и идентификатор книги по физике из коллекции книг ... поэтому я начал как books.agregate (соответствие имени книги), затем найдите ученика, но у ученика есть только имя Чайхер, с которым я должен найти идентификатор учителя из коллекции учителей ... Я должен вставить идентификатор, имя, идентификатор учителя в запись ученика

1 Ответ

0 голосов
/ 27 мая 2020

Вы неправильно используете оператор $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"
  }
]
...