2017-01-04 3 views
0

Предупреждение (students: [{id: ""}, {id: ""}] структуры коллекции школы может приходит неразумным. Но вместо размещения моих документов, я пытаюсь создать подобную структуру)

Предположат, у меня есть две разных коллекций.

Один из них: user коллекция as;

{id: "1", name: "alex"}, 
{id: "2", name: "sasha"}, 
{id: "3", name: "lenny"}, 
{id: "4", name: "hannah"} 

другой: school коллекция as;

{ 
    "id" : "1", 
    "name" : "University of Cambridge", 
    "students" : [ 
     { 
     "id" : "1" 
     }, 
     { 
     "id" : "2" 
     } 
    ], 
} 
{ 
    "id" : "2", 
    "name" : "University of Oxford", 
    "students" : [ 
    { 
     "id" : "3" 
    }, 
    { 
     "id" : "4" 
    } 
    ], 
} 

Что мне нужно, это сопоставить имя пользователя с их именем и отобразить его имя в новом столбце как;

{ 
    id: "1", 
    name: "University of Cambridge", 
    students: [ 
     {id: "1"}, 
     {id: "2"} 
    ], 
    studentNames: ["alex", "sasha"] 
}, 
{ 
    id: "2", 
    name: "University of Oxford", 
    students: [ 
     {id: "3"} , 
     {id: "4"} 
    ], 
    studentNames: ["lenny" , "hannah"] 
} 

Что я сделал до сих пор?

db.school.aggregate([ 
    { 
     $lookup: { 
      from: "student", 
      localField: "students.id", 
      foreignField: "id", 
      as: "studentName" 
     } 
    }, 
]) 

, но этот запрос возвращает studentName как пустой;

{ 
    "id" : "1", 
    "name" : "University of Cambridge", 
    "students" : [ 
     { "id" : "1" }, 
     { "id" : "2" } 
    ], 
    "studentName" : [ ] 
} 
{ 
    "id" : "2", 
    "name" : "University of Oxford", 
    "students" : [ 
     { "id" : "3" }, 
     { "id" : "4" } 
    ], 
    "studentName" : [ ] 
} 

Что мне не хватает?

+0

Добавить {$ раскрутку: "$ студентов"}, прежде чем искать сцену. Из документов. Если ваш localField является массивом, вам нужно добавить этап $ unwind в ваш конвейер. Подробнее здесь https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/ – Veeram

ответ

0

Вы можете попробовать что-то вроде этого. Он похож на существующий ответ, но добавил в качестве альтернативы.

$ Расслабьтесь студентов массив для поиска стадии.

$ найти ученика из коллекции пользователей и собрать их в информационную область для студентов.

студенты $ группы вместе по школе ид

$ проект сформатировать ответ

db.school.aggregate([{ 
    $unwind: "$students" 
}, { 
    $lookup: { 
     from: "user", 
     localField: "students.id", 
     foreignField: "id", 
     as: "studentInfo" 
    } 
}, { 
    $group: { 
     _id: "$id", 
     name: { 
      $first: "$name" 
     }, 
     studentsInfo: { 
      $push: { 
       $arrayElemAt: [ 
        "$studentInfo", 
        0 
       ] 
      } 
     } 
    } 
}, { 
    $project: { 
     "_id": 1, 
     "name": 1, 
     "studentIds": "$studentsInfo.id", 
     "studentNames": "$studentsInfo.name" 
    } 
}]);