关于mongodb关联查询($lookup)的使用(对比Mysql语句)

假设有一张学生表和班级表

学生表(stu)信息如下

idnamesex
1张三
2李四
3王二

班级表(class)

idname
1初一(1)班
2初二(2)班

学生班级关联表(re-stu-class)

uidcid
12
22
31

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:代表输出数组的字段
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值