收藏
回答

如何解决lookup联查数据量较大的表时timeout?

表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

有没有技术大神帮我看看问题出在哪里,能详细一点就详细一点拜托了。

回答关注问题邀请回答
收藏

2 个回答

  • 郑旭东
    郑旭东
    2022-05-28

    mongodb型数据库,一般只做单条数据联查,不做多条数据联查。考虑把需要到B表取的数据冗余到A表。


    2022-05-28
    有用
    回复
  • 跨商通
    跨商通
    2022-05-28

    1、云控制台--云函数--版本与配置--配置--高级配置--超时时间--改为60秒

    2022-05-28
    有用
    回复
登录 后发表内容