如何在两个集合之间建立查找连接

Posted

技术标签:

【中文标题】如何在两个集合之间建立查找连接【英文标题】: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",


         
    

]);

【问题讨论】:

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

【讨论】:

我有一个问题。是否可以使用上面的代码并将其应用于视图?创建视图时,您必须应用特定的集合。

以上是关于如何在两个集合之间建立查找连接的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose - 如何聚合两个集合中的内容

已经建立了两个表,请问如何用SQL语句建立关联?

在 NAT 后的两台计算机之间建立连接

如何在对等js中建立对等点之间的连接

如何在 csharp 和 Java 之间建立连接

如何使用 socket.io-p2p 在房间内建立对等连接?