小程序云开发联表查询
问题
我现在有两个集合,一个是category(类别),一个是site(地点),而一个类别下有很多个地点
那如果我要查出某个类别下有哪些类别怎么办?
解决方式
官方给出的方法是 聚合查询 和 lookup函数 联表查询官方文档
我这里用 lookup函数 来进行联表查询 lookup函数官方文档
官方给出两种方法
- 相等匹配 就是两张集合里的两个字段的内容相同,进行匹配
- 自定义连接条件、拼接子查询 如果有这方面要求的可以自己研究
这里使用相等匹配
当然如果看的一脸懵也没事,直接看我的例子
我的集合结构如下
集合说明
类别集合有c_i(类别编号)字段,地点集合有c_id(当前地点所属类别编号)字段。
既然两张集合有可以做连接的字段(两个集合中用作连接的字段名称不一定要相同,我只是为了方便写成一样的了)
那就可以用 lookup函数 来实现联表查询
代码说明
const db = cloud.database()
const _ = db.command
const $ = _.aggregate
// 云函数入口函数
exports.main = async (event, context) => {
return await db.collection('category').aggregate()
.lookup({
from: 'site',
localField: 'c_id',
foreignField: 'c_id',
as: 'site_list',
})
.end()
}
但我写的代码是啥意思呢?
db.collection('category').aggregate()
这行应该很好理解,就是对类别集合进行聚合操作(aggregate是聚合,lookup就是aggregate的一个方法)
lookup({})
就是调用这个函数,那里面的四个参数又是啥意思呢?
from: 'site',
localField: 'c_id',
foreignField: 'c_id',
as: 'site_list',
from的参数可以理解为**另一个集合** 连接的那个集合(地点集合)(我要查类别下的地点,当然是和地点集合做连接啦,所以是site)
localField的参数可以理解为**当前集合的外键** 当前集合(类别集合)进行连接的字段(c_id),就是类别集合里的c_id字段啦
foreignField的参数可以理解为**另一个集合的外键** 连接的那个集合(地点集合)进行连接的字段(c_id),就是地点集合里的c_id字段啦
as的参数可以理解为**结果数组名称** 结果作为一个数组形式输出,那个数组的名字(这里就是把那个输出结果的数组命名为site_list了)
最后把返回来的结果中的site_list取出来用就行啦
当然这样的话是把每一个类别下的地点都分别查出来了。
条件查询
那如果我只要查指定一个类别下的地点怎么办呢
需要加一个where条件,在lookup后面不能直接跟where,需要用match来代替。改进一下上面的代码
比如我只想查图书馆类别下的所有地点(当然你也可以传参进来)
const db = cloud.database()
const _ = db.command
const $ = _.aggregate
// 云函数入口函数
exports.main = async (event, context) => {
return await db.collection('category').aggregate()
.lookup({
from: 'site',
localField: 'c_id',
foreignField: 'c_id',
as: 'site_list',
})
.match({
name: "图书馆"
})
.end()
}
结果就只有图书馆类别下的地点啦
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具