eoc
eoc
  • 发布:2022-09-17 16:51
  • 更新:2022-09-23 21:40
  • 阅读:280

如何联表查询输出,用lookup方式很慢

分类:uniCloud

A表

{  
    "_id": "1f",  
    "title": "标题",  
    "content": "内容"  
},  
{  
    "_id": "2f",  
    "title": "标题2",  
    "content": "内容2"  
}  

B表

{  
    "_id": "b94d681e7d323429b509b1fdb5012034",  
    "cdn_compress_path": "地址1",  
    "pid": ["1f"]  
}  
{  
    "_id": "28f1e9529fd55d9644375d8e42091fcf",  
    "cdn_compress_path": "地址2",  
    "pid": ["1f", "2f"]  
}  
{  
    "_id": "586bdfb69c110b465b2768ad82a281ca",  
    "cdn_compress_path": "地址3",  
    "pid": ["2f"]  
}

想要的查询结果

[{  
    "_id": "1f",  
    "title": "标题",  
    "content": "内容",  
    "list": [{  
        "_id": "b94d681e7d323429b509b1fdb5012034",  
        "cdn_compress_path": "地址1",  
        "pid": ["1f"]  
    }, {  
        "_id": "28f1e9529fd55d9644375d8e42091fcf",  
        "cdn_compress_path": "地址2",  
        "pid": ["1f", "2f"]  
    }]  
}, {  
    "_id": "2f",  
    "title": "标题2",  
    "content": "内容2",  
    "list": [{  
        "_id": "28f1e9529fd55d9644375d8e42091fcf",  
        "cdn_compress_path": "地址2",  
        "pid": ["1f", "2f"]  
    }, {  
        "_id": "b94d681e7d323429b509b1fdb5012034",  
        "cdn_compress_path": "地址3",  
        "pid": ["2f"]  
    }]  
}]  

因为B表的数据有10多万条,用lookup查询超时,要么就是动不动就耗时几千ms


db.collection('A表').aggregate()  
    .lookup({  
        from: 'B表',  
        let: {  
            pid: '$_id'  
        },  
        pipeline: $.pipeline()  
            .match(dbCmd.expr(  
                $.in(['$$pid', '$pid'])  
            )).project({  
                cdn_compress_path: 1,  
                pid: 1  
            }).limit(4).done(),  
        as: 'list',  
    })  
    .limit(10)  
    .project({  
        title: 1,  
        content: 1,  
        list: 1  
    })  
    .end()

如何在A表设置foreignKey查询啊

2022-09-17 16:51 负责人:DCloud_uniCloud_WYQ 分享
已邀请:
DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

先对主表进行过滤分页,再进行lookup

  • eoc (作者)

    请问具体应该怎么写的

    2022-09-19 11:33

  • DCloud_uniCloud_WYQ

    回复 eoc: 把limit(10)挪到lookup之前

    2022-09-19 15:18

  • eoc (作者)

    回复 DCloud_uniCloud_WYQ: 没有区别的。我再查询管理器上面测试室的时间是一样的 "timeCost": 1922

    2022-09-19 15:53

  • DCloud_uniCloud_WYQ

    回复 eoc: 那个时间不是真正的查询耗时,而是包含了网络请求的还有一些其他操作的,如果你要测试耗时可以在云函数里面写这个查询语句,前后打印时间戳测试

    2022-09-20 11:34

hws007

hws007 - 我就是我!

一般,我查询,就直接在前端用unicloud-db组件,或JQL操作数据库查询,DB Schema可以配置权限,也足够安全,这样更方便,写法更简单,官方的利器!好好用
增加,更新,删除,我就调用云对象去操作

联表查询优化,可以看看这个:
https://uniapp.dcloud.net.cn/uniCloud/jql.html#lookup-with-temp

要回复问题请先登录注册