微信小程序云开发联表查询,详细用法,防踩坑
问题描述
最近在用云开发开发小程序时遇到了很多的小问题,其中最让我烦恼的就是数据的冗余。 最初设计的时候为了减少读取数据的次数将数据库的每个集合做了很多冗余,为了一次读取就能获得全部渲染的数据,但后来发现这样方式会导致每次获取的数据量过多而云函数报错。
解决方法
所以我的解决方法就是 1.数据表设置相应外键 2.每次获取数据使用小程序云开发提供的lookup函数来联表查询
lookup({
from: <要连接的集合名>,
localField: <输入记录的要进行相等匹配的字段>,
foreignField: <被连接集合的要进行相等匹配的字段>,
as: <输出的数组字段名>
})
参数说明
from 要进行连接的另外一个集合的名字
localField 当前流水线的输入记录的字段名,该字段将被用于与 from 指定的集合的 foreignField 进行相等匹配。如果输入记录中没有该字段,则该字段的值在匹配时会被视作 null
foreignField 被连接集合的字段名,该字段会被用于与 localField 进行相等匹配。如果被连接集合的记录中没有该字段,该字段的值将在匹配时被视作 null
as 指定连接匹配出的记录列表要存放的字段名,这个数组包含的是匹配出的来自 from 集合的记录。如果输入记录中本来就已有该字段,则该字段会被覆写
注意点
- 这个lookup的查询方法必须在云函数中使用,在小程序端是会报错的
- 在云函数端使用记得return回数值!不然会调用成功但是却没有返回数据
- 如果报错的话大家记得检查一下输入的参数是否为undefined,或者根据上面那几个坑排一排。
在实际使用的时候可以设置参数以用于多个Js读取数据时更加灵活 如下
// 云函数入口文件
const cloud = require(wx-server-sdk)
cloud.init({
env: notedo-cbwcz})
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
try {
return await db.collection(event.collection).aggregate().lookup({
from:event.from,
localField: event.localField,
foreignField: event.foreignField,
as: event.as
})
.lookup({
from:event.from2,
localField: event.localField2,
foreignField: event.foreignField2,
as: event.as2
}).
match(event.match)
.end()
} catch (e) {
console.error(e)
}
}
我这里使用的时三个表联查,如果你只需要两个表联查你只需要使用一次lookup方法。
举个例子,比如一张个人信息表,里面有一个人参加的所有活动,活动的保存形式是活动表的 _id 字段 在查询时你只需要将collection表填写个人信息表,form填活动信息表,字段就选择两个表中内容相同的那个字段,最后获取出来后你的数据中的每一个活动的字段就是那个活动的所有内容啦!
下面放一下再调用的例子
wx.cloud.callFunction({
name:lookup,
data:{
collection:user,
from:department,
localField:department.department_id,
foreignField:_id,
as:department,
from2:act,
localField2:department._id,
foreignField2:activity,
as2:act,
match:{
_id:app.globalData.openid}
},
success:res=>{
console.log(res.result.list)
this.setData({
myinfo:res.result.list[0]})
}
})
}
总结
实际上云开发的数据库就是mongodb的云端版本,很多功能如果在云开发的文档里找不到的话倒不如去mongodb的文档看看
