报名记录表结构
产品表结构
用户表结构
?关联关系:
目标:查询工号为122员工的客户报名记录
关系:
- 客户报名记录表的product_id关联产品表的_id -> 获取该客户的报名产品
- 客户报名记录表的opid关联用户表的opid ->获取该客户的个人信息
- 这样可以获取所有客户的报名记录,接下来筛选工号为122员工的客户报名记录
- 筛选:客户报名记录表的employee_id 等于?用户表的?employee_id
注意:分页查询需要在sort后再分页,不然聚合后不行,且sort排序的字段最好唯一
分页说明:skip跳至多少条,limit限制显示多少条
- 第一页skip是0*10,limit是10
- 第二页skip是1*10, limit是10
- 那么skip参数为-> skip(pageSize*page),page首次传0
- limit传入10
具体代码:
//查询客户报名记录
exports.queryUserRecords = async function (event, cloud) {
const db = cloud.database()
const _ = db.command
const $ = _.aggregate
let pageSize = 10;
let page = (parseInt(event.page)-1) * pageSize
return await db.collection('sign_records')
.aggregate() //可进行联表查询,返回联表查询对象
.lookup({ // 关联查询 left join
from: 'products', //要关联的表products
// localField: 'product_id', //sign_records表中的关联字段
// foreignField: '_id', //products表中关联字段
let: {
product_id: '$product_id', // 主表的product_id
},
pipeline: $.pipeline()
.match(_.expr($.and([
$.eq(['$_id', '$$product_id'])
]))) //主表的产品id与当前表的_id比较
.project({ //不显示当前指定字段
opid: 0,
product_type: 0,
status: 0,
unionid: 0,
urls: 0
})
.done(),
as: 'productlist' //定义输出数组的别名
})
.lookup({ // 关联查询 left join
from: 'users', //要关联的表user
// localField: 'opid', //sign_records表中的关联字段
// foreignField: 'opid', //user表中关联字段
let: {
s_opid: '$opid'// 主表的opid
},
pipeline: $.pipeline()
.match(_.expr($.and([
$.eq(['$opid', '$$s_opid'])
]))) //主表的opid与当前表的opid比较
.project({ //不显示当前指定字段
address_info: 0,
avatar_url: 0,
create_at: 0,
password: 0,
unionid: 0,
update_at: 0,
user_type: 0
})
.done(),
as: 'userlist' //定义输出数组的别名
})
.project({ //不显示部分
update_at: 0, //管理员更新记录时间
signtime: 0, //签到时间
starttime: 0, // 开始签到时间
})
.match({
'employee_id': event.employee_id
})
.sort({'create_at':-1,'opid':-1}) // 不排序没办法分页
.skip(event.page*pageSize)
.limit(pageSize)
.end()
}
查询结果:
?
|