2016-05-05 2 views
1

структура данныхКак извлечь поддокументами ссылки в MongoDB

"classrooms" : [ 
    { 
     id : ObjectId("class1") 
     "students" : [ 
      ObjectId("student1") 
     ], 
    }, 
    { 
     id : ObjectId("class2") 
     "students" : [ 
     ] 
    } 
], 
"students" : [ 
    { 
     "id" : ObjectId("student1"), 
     "firstname" : "Ciljan", 
     "age" : NumberInt(23) 
    }, 
    { 
     "id" : ObjectId("student2"), 
     "firstname" : "John", 
     "age" : NumberInt(19) 
    } 
] 

Необходимость

я должен предоставить документ, где есть классы и студенты. Студенты могут быть назначены в определенную классную комнату, но не всегда, поэтому студент может освободиться. С предыдущей структурой данных у меня есть поддокумент «ученики», который предоставляет список всех доступных студентов, назначенных и не назначенных. Я могу назначить ученика классу, хранящему идентификатор студента в массиве учеников классов.

Проблема

Как я могу получить эти данные для того, чтобы иметь для каждого класса всех записей о назначенных своих студентах?

ответ

0

Вы имеете в виду что-то вроде Classroom.find({}).populate('students')? Это вернет массив классных комнат с заполненными полями учащихся.

+0

Возможно, эта функция «заполнения» не существует для родного драйвера MongoDB Node.js. Может быть, эта команда для Мангуста? –

+0

модуль mongoose имеет «заселение», уже встроенное: http://mongoosejs.com/docs/api.html#document_Document-populate Рассматривая ваш фрагмент, похоже, что классные комнаты и студенты являются частью более крупной схемы, в в этом случае вам понадобится плагин с глубоким населением: https://www.npmjs.com/package/mongoose-deep-populate Как только вы зарегистрируете плагин с помощью схемы, вызов LargerSchema.find ({}) .deepPopulate ('classrooms classrooms.students') –

+0

Большое спасибо, хотя я должен использовать только ** MongoDB Node.js Native Driver **, а не Mongoose. Модуль, который вы связываете, всегда связан с модой Mongoose, который для моей логической реализации я не могу использовать. Может быть, я должен сделать это сам. –