表std_info的文档结构如下:
{
"class_id": "fbf765c862908f8702fd348d0de8c170",
"sname": "张三",
"sid": "1234567890123",
"phone": "13900000000",
"together" :[ “family_id”: "5c8627d2f6b00ad15c8627d2f6b00ad1" ]
}
表daily_imgs的文档结构如下:索引person_id和daily_date
{
"person_id":"058dfefe627496f7019eeac831dd5b23",
"daily_date": 1652544000000,
"risk": "dangerous"
}
联查代码如下:
db = context.database;
const $ = db.command.aggregate;
const _ = db.command;
const stdConnect = db.collection("std_info");
var stdRes = await stdConnect.aggregate()
.match({class_id : "fbf765c8627d2f6b00ad1ed26a25dfc0"}).unwind('$together')
.addFields({ 'togetherId': '$together.family_id' })
.project({ sname: 1, togetherId: 1, class_id: 1 })
.lookup({ from: 'daily_imgs',
let: { daily_date: '$picDate', daily_pid: '$person_id' },
pipeline: $.pipeline().match(_.expr($.and([
$.eq(['$$daily_date', 1652544000000]),
$.eq(['$togetherId', '$$daily_pid']),
])))
.project({
_id: 0,
risk: 1,
})
.done(),
as: 'family_pics' })
.end()
表std_info的数据量大概在10k左右,预计增长到30k,后面称之为表A
表daily_imgs的数据量大概在130k左右,每日增长在20k,后面称之为表B
解释下我的代码思路,先通过class_id的match把表A的数据量缩小到50左右,之后展开together数组,数据量大概在200
addFields把子属性提取出来,过滤到掉其他不需要的文档内容,准备开始联查
联查时先通过daily_date把表B数据缩小到20K,然后两表数据比对,最后处理结果
目前情况timeout显示运行时间超过3S
有没有技术大神帮我看看问题出在哪里,能详细一点就详细一点拜托了。
mongodb型数据库,一般只做单条数据联查,不做多条数据联查。考虑把需要到B表取的数据冗余到A表。
1、云控制台--云函数--版本与配置--配置--高级配置--超时时间--改为60秒