MongoDB-聚合操作$lookup
聚合管道阶段
$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>
: 使用 $$ 来指示系统变量
分类:
MongoDB4.X+新特性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具