假设有一张学生表和班级表
学生表(stu)信息如下
id | name | sex |
---|---|---|
1 | 张三 | 男 |
2 | 李四 | 女 |
3 | 王二 | 男 |
班级表(class)
id | name |
---|---|
1 | 初一(1)班 |
2 | 初二(2)班 |
学生班级关联表(re-stu-class)
uid | cid |
---|---|
1 | 2 |
2 | 2 |
3 | 1 |
1.如果我们想查询初一(1)班级的学生
在mysql中需要执行的语句
select b.name from re-stu-class a
left join stu b ob a.uid=b.id
where a.cid=1
而在mongodb中需要执行的语句
db.re-stu-class.aggregate([
{
$match:{
cid:1
}
},
{
$lookup:{
from:"stu",
localField:"uid",
foreignField:"id",
as:"resultInfo"
}
},
{
$unwind: "$resultInfo"
},
{
$project:{
resultInfo:{
name:1
}
}
}
])
当前形式中$lookup各个字段的含义
from代表连接的集合
localField代表主集合字段
foreignField代表连接集合的字段
as代表输出数组的字段
2.如果我们想查询初一(1)班级的学生并且是男生的姓名
在mysql中
select b.name from re-stu-class a
left join stu b ob a.uid=b.id and sex='男'
where a.cid=1
而在mongodb中需要执行的语句
db.re-stu-class.aggregate([
{
$match:{
cid:"1"
}
},
{
$lookup:{
from:"stu",
let: { uid: "$uid"},
pipeline:[
{
$match:{
$expr:{
$and:[
{
"$eq":["$sex","男"]
},
{
"$eq":["$id","$$uid"]
}
]
}
}
}
],
as:"resultInfo"
}
},
{
$unwind: "$resultInfo"
},
{
$project:{
resultInfo:{
name:1
}
}
}
])
当前形式中$lookup各个字段的含义
from:代表连接的集合
let:代表主输入集合的字段。比如 { uid: "$uid"}中,
这里的$uid标识re-stu-class集合里的uid。在pipeline中,用$获取
pipeline:代表管道输入,需要和let进行配合使用。
当在$expr操作符有$eq、$lt、$lte、$gt、$gt
as:代表输出数组的字段