【问题标题】:How to Make a Lookup connection between two Collection如何在两个集合之间建立查找连接
【发布时间】:2019-11-02 13:20:41
【问题描述】:

目标:
这个 sql 和它的结果应该和 mongoDB 的查询代码的结果是一样的。
换句话说,结果相同,但对于 mongoDB。

问题:
如何在 Mongo DB 的查询代码中建立与 PeopleRole 相关的查找连接?

信息:
我是 mongo 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

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"}]

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",


        } 
    }

]);

【问题讨论】:

    标签: sql mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您需要以双 $lookup 开头,因为您有三个集合。然后您可以使用$arrayElemAt 始终从查找结果中获取单个元素。要扁平化您的结构,您可以使用 $replaceRoot$mergeObjects(将所有字段从 peoplecourse 提升到根级别。

    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 来重命名这些字段之一 - 否则您将在最终结果中只获得其中一个。

    【讨论】:

    • 我有一个问题。是否可以使用上面的代码并将其应用于视图?创建视图时,您必须应用特定的集合。
    猜你喜欢
    • 2021-08-27
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多