如何在两个集合之间建立查找连接
Posted
技术标签:
【中文标题】如何在两个集合之间建立查找连接【英文标题】:How to Make a Lookup connection between two Collection 【发布时间】:2019-11-02 13:20:41 【问题描述】:目标: 这个 sql 和它的结果应该和 mongoDB 的查询代码的结果是一样的。 换句话说,结果相同,但对于 mongoDB。
问题: 如何在 Mongo DB 的查询代码中建立与 People 和 Role 相关的查找连接?
信息: 我是 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(将所有字段从 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
来重命名这些字段之一 - 否则您将在最终结果中只获得其中一个。
【讨论】:
我有一个问题。是否可以使用上面的代码并将其应用于视图?创建视图时,您必须应用特定的集合。以上是关于如何在两个集合之间建立查找连接的主要内容,如果未能解决你的问题,请参考以下文章