聚合管道阶段
$lookup: 用来做关联查询
格式:
{$lookup:{
from: 关联集合名称,
localField: 当前集合中的字段名称,
foreignField:关联集合中的字段名称,
as: 输出字段的名称
}}
添加测试数据:
db.person.insert([
{name:{firstName:'Jonathan', lastName:'Lee'}, age:18, books:['html', 'js']},
{name:{firstName:'Amelie', lastName:'Jiang'}, age:19, books:['vue']},
{name:{firstName:'si', lastName:'Li'}, age:20, books:[]}
]);
db.books.insert([
{name:'html', price:88},
{name:'js', price:99},
{name:'vue', price:110},
]);
db.person.find();
使用 $lookup:
db.person.aggregate([
{
$lookup:{
from: 'books',
localField: 'books',
foreignField: 'name',
as: 'booksData'
}
}
])
和 unwind 阶段结合使用
- 可以有效的过滤掉无效数据
- 可以给每个匹配的结果生成一个新的文档
db.person.aggregate([
{
$unwind:{
path:'$books'
}
},
{
$lookup:{
from: 'books',
localField: 'books',
foreignField: 'name',
as: 'booksData'
}
}
])
其实 $lookup 还有第二种使用方式,关键字有几个不一样含义分别如下:
{$lookup:{
from: 关联集合名称,
let: {定义给关联集合的聚合操作使用的当前集合的常量},
pipeline: [关联集合的聚合操作]
as: 输出字段的名称
}}
不相关查询
db.person.aggregate([
{
$lookup:{
from: 'books',
pipeline: [
{
$match:{
price:{$gte:100}
}
}
],
as: 'booksData'
}
}
])
相关查询
db.person.aggregate([
{
$lookup:{
from: 'books',
let: { bks: '$books'},
pipeline: [
{
$match:{
$expr:{
$and:[
{$gte: ['$price', 100]},
{$in: ['$name', '$$bks']}
]
}
}
}
],
as: 'booksData'
}
}
])
系统变量表达式
$$<variable>
: 使用 $$ 来指示系统变量