评论

如何突破一次只能获取20条记录的limit限制?只需要一行代码。

云开发数据库每次只能拉取最多100条记录(云端1000),但是碰到需要一次性拉取大数量记录的情况,怎么办?一句代码即可。

笔者刚遇到需要一次性拉取超过100条(云函数里超过1000条)记录的这种需求。

一般情况下,会有下面两种处理方式:

1、先获取总数,再for循环,每次拉取limit条记录;(可结合Promise.all并发)

2、递归拉取,每次拉取limit条记录,直到拉取的记录数量小于limit。

以上两种方式都比较麻烦,于是动了一脑筋,以最简单的方式实现上面的需求。

极简代码如下:

    db.collection('order').aggregate()
    .match({
      status:'已付费'
    })
    .addFields({
      tempTag:1 //增加一个临时标签;也可以不要addFields这个阶段;
    })
    .group({
      _id:'$tempTag',
      orders:$.push('$$ROOT') //一次性拉取超过100条或者1000条记录
    })
    .end()
    .then(res=>{
      let orders = res.list[0].orders
      console.log(orders)
    })

一个临时标签,搞定。

小心数据量太大搞崩了,崩溃的极限是多少,需要各位自行摸索了。

需要注意的是,如果是云函数里执行以上代码(比如lookup),返回小程序端的数据量不要超过1M。

最后一次编辑于  2021-03-15  
点赞 6
收藏
评论

4 个评论

  • 毕鲜生
    毕鲜生
    2023-02-10

    请问一下,如果超过1M,怎么处理呢?好像云开发后台都崩溃了。。。

    2023-02-10
    赞同
    回复 1
    • 老张
      老张
      2023-02-12
      超过1M的话,建议分多次获取数据。
      2023-02-12
      回复
  • 赵正
    赵正
    2021-10-29

    我试了,我这里不管用啊。还是输出20条记录。

    添加了

        .addFields({

          tempTag:1 //增加一个临时标签;也可以不要addFields这个阶段;

        })


    2021-10-29
    赞同
    回复 1
    • 赵正
      赵正
      2021-10-29
      没用 group ,只有lookup
      2021-10-29
      回复
  • 呵呵
    呵呵
    2021-08-16


    老师,不行啊


    2021-08-16
    赞同
    回复 2
    • 老张
      老张
      2021-08-16
      抄都不会抄的话,我没办法了。aggregate呢?先去补补基础课,这是高级功能。
      2021-08-16
      回复
    • 呵呵
      呵呵
      2021-08-18回复老张
      有啊
      2021-08-18
      回复
  • yangxuqing
    yangxuqing
    2021-06-29

    挺有用,收藏以备查阅

    2021-06-29
    赞同
    回复
登录 后发表内容