Как сделать связь поиска между двумя коллекциями - PullRequest
1 голос
/ 02 ноября 2019

Цель:
Этот sql и его результат должны совпадать с кодом запроса mongoDB.
В словах заказов тот же результат, но для mongoDB.

Проблема:
Как вамсделать соединение поиска в отношении людей и роли в коде запроса Mongo DB?

Информация:
Я новичок в Монго DB

SQL code 
    SELECT 
        a.*,
        '.' AS '.',
        b.*,
        '.'  AS '.',
        c.*
    FROM 
        [db1].[dbo].[People_Course_Grade] a
        INNER JOIN [db1].[dbo].[People] b on a.PeopleId = b.PeopleId
        INNER JOIN [db1].[dbo].[Role] c on b.RoleId = c.RoleId

enter image description here

Данные Json:

Role:  
[{"RoleId":1,"Name":"Student"},{"RoleId":2,"Name":"Teacher"}]

People_Course_Grade:   
[{"People_Course_GradeId":1,"PeopleId":1,"CourseId":1}, 
 {"People_Course_GradeId":2,"PeopleId":2,"CourseId":1}, 
 {"People_Course_GradeId":3,"PeopleId":3,"CourseId":2}, 
 {"People_Course_GradeId":4,"PeopleId":1,"CourseId":2}]

Course:
[{"CourseId":1,"Name":"Java"},{"CourseId":2,"Name":"Java II"}, 
 {"CourseId":3,"Name":"Statistik 1"}]

Mongo db

db.People_Course_Grade.aggregate([

    {
        $lookup:{
            from: "People",            
            localField: "people_id",   
            foreignField: "_id",       
            as: "people"               
        }
    },
    {   $unwind:"$people" },   


    {   
        $project:{
            course_id : 1,
            people_id : 1,
      //      grade_id : 1,
            Name : "$people.Name",


        } 
    }

]);

1 Ответ

0 голосов
/ 02 ноября 2019

Вам нужно начать с двойного $ lookup , так как у вас есть три коллекции. Затем вы можете использовать $ arrayElemAt , чтобы всегда получать отдельный элемент из результата поиска. Чтобы выровнять свою структуру, вы можете использовать $ replaceRoot с $ mergeObjects (переводит все поля с people и course на корневой уровень.

db.People_Course_Grade.aggregate([
    {
        $lookup:{
            from: "Role",            
            localField: "PeopleId",   
            foreignField: "RoleId",       
            as: "people"               
        }
    },
    {
        $lookup:{
            from: "Course",            
            localField: "CourseId",   
            foreignField: "CourseId",       
            as: "course"               
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $mergeObjects: [
                    "$$ROOT",
                    { $arrayElemAt: [ "$people", 0 ] },
                    { $arrayElemAt: [ "$course", 0 ] },
                ]
            }
        }
    },
    {
        $project: {
            people: 0,
            course: 0
        }
    }
])

Mongo Playground

$arrayElemAt всегда можно заменить на $unwind, как вы пытались. У вас также есть конфликт имен в поле name, поэтому, вероятно, вам нужно запустить $project дляпереименуйте одно из этих полей - в противном случае вы получите только одно из них в конечном результате.

...