收藏
回答

前端无法读取云数据库集合中的的所有记录

框架类型 问题类型 终端类型 AppID 基础库版本
小程序 需求 客户端 wx6f5994d98a39ed23 2.2.5

- 需求的场景描述(希望解决的问题)

您好,我们在读云数据库中某个集合的所有记录(我们的例子集合的记录有60条)时,发现求集合总数的代码段 总是 在 实际循环读取记录(云平台规定每次只能读20条记录)的后面,这样就使得计算读多少次失去了意义;另外发现循环读的时候,skip(0)报错误,代码如下。


        const db1 = wx.cloud.database()

        const MAX_LIMIT = 20


        // 先取出集合记录总数

        db1.collection('BSDX3S1D1KZC').count().then(res => {

          this.setData({

              wordnum1: res.total

            }),

            console.log(res.total)

        })


        wordnum = this.data.wordnum1

        // 计算需分几次取

        const batchTimes = Math.ceil(wordnum / MAX_LIMIT)


       //读取第一个20条记录

        db1.collection('BSDX3S1D1KZC').get({

          success: res => {

            // res.data 包含该记录的数据

            console.log(res)

          },

          fail: err => {

            cosole.log(err)

          }

        })

       

//循环读取第2~3个 20条记录

        for (let i = 1; i < 3; i++) { //3应该为batchTimes

          var skipnum = i * MAX_LIMIT

          db1.collection('BSDX3S1D1KZC').skip(skipnum)

            .get({

              success: res => {

                // res.data 包含该记录的数据

                console.log(res)

              },

              fail: err => {

                cosole.log(err)

              }

            })

        }


- 希望提供的能力

请问,

1 怎样才能使得"先取出集合记录总数"的代码  在 “读取第一个20条记录”,和循环读取第2~3个 20条记录” 的代码  之前 执行,这样保证循环数 batchTimes能够提前算出来?

        2 怎样防止skip(0)出错,使得  “读取第一个20条记录”,和循环读取第2~3个 20条记录” 的代码能合并在一个循环里?

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

3 个回答

  • 2018-11-09
    1. 可以把计算和下面的操作都放到一个方法里,然后在获取总条数之后调用,

    2. db1.collection('BSDX3S1D1KZC').skip(0).limit(20).get(),这里的skip不能为0,如果想取前20条,可以直接db1.collection('BSDX3S1D1KZC').limit(20).get()这样取就好了,在循环里加个if判断如果i==1的话执行db1.collection('BSDX3S1D1KZC').limit(20).get()如果不等于1就执行db1.collection('BSDX3S1D1KZC').skip(skipnum).limit(20).get()

    2018-11-09
    有用 1
    回复 1
    • 2018-11-09

      多谢!

      2018-11-09
      回复
  • 2018-11-09

    谢谢您帮助。试验

    db1.collection('BSDX3S1D1KZC').skip(0).limit(60).get()

    .then(console.log)

    .catch(console.error)

    提示:


    VM1004:1 thirdScriptError

    errCode: -401002 api parameter error | errMsg: parameter offset of function skip must be provided;at pages/WordTest/WordTest page lifeCycleMethod onLoad function

    Error: errCode: -401002 api parameter error | errMsg: parameter offset of function skip must be provided

        at new t (http://127.0.0.1:45447/appservice/__dev__/WAService.js:22:14994)

        at Object.i [as assertRequiredParam] (http://127.0.0.1:45447/appservice/__dev__/WAService.js:22:13547)

        at t.e.skip (http://127.0.0.1:45447/appservice/__dev__/WAService.js:21:9208)

        at t.onLoad (http://127.0.0.1:45447/appservice/pages/WordTest/WordTest.js:157:40)

        at t.<anonymous> (http://127.0.0.1:45447/appservice/__dev__/WAService.js:19:13907)

        at $t (http://127.0.0.1:45447/appservice/__dev__/WAService.js:19:30369)

        at Zt (http://127.0.0.1:45447/appservice/__dev__/WAService.js:19:31040)

        at sn (http://127.0.0.1:45447/appservice/__dev__/WAService.js:20:469)

        at Function.<anonymous> (http://127.0.0.1:45447/appservice/__dev__/WAService.js:20:3006)

        at L.<anonymous> (http://127.0.0.1:45447/appservice/__dev__/WAService.js:19:1500)



    如果将skip(0)修改为skip(1),即

    db1.collection('BSDX3S1D1KZC').skip(1).limit(60).get()

    .then(console.log)

    .catch(console.error)


    读出来的 只有20条记录,无法全读出

    {data: Array(20), errMsg: "collection.get:ok"}


    请您再帮助看下,谢谢!

    2018-11-09
    有用
    回复
  • 半寸灰
    半寸灰
    2018-11-08
    db1.collection('BSDX3S1D1KZC').skip(0).limit(60).get()

    一次全部读出来就可以了


    2018-11-08
    有用
    回复 11
    • 2018-11-09

      谢谢您帮助。试验

      db1.collection('BSDX3S1D1KZC').skip(0).limit(60).get()

      .then(console.log)

      .catch(console.error)

      提示:


      VM1004:1 thirdScriptError

      errCode: -401002 api parameter error | errMsg: parameter offset of function skip must be provided;at pages/WordTest/WordTest page lifeCycleMethod onLoad function

      Error: errCode: -401002 api parameter error | errMsg: parameter offset of function skip must be provided

          at new t (http://127.0.0.1:45447/appservice/__dev__/WAService.js:22:14994)

          at Object.i [as assertRequiredParam] (http://127.0.0.1:45447/appservice/__dev__/WAService.js:22:13547)

          at t.e.skip (http://127.0.0.1:45447/appservice/__dev__/WAService.js:21:9208)

          at t.onLoad (http://127.0.0.1:45447/appservice/pages/WordTest/WordTest.js:157:40)

          at t.<anonymous> (http://127.0.0.1:45447/appservice/__dev__/WAService.js:19:13907)

          at $t (http://127.0.0.1:45447/appservice/__dev__/WAService.js:19:30369)

          at Zt (http://127.0.0.1:45447/appservice/__dev__/WAService.js:19:31040)

          at sn (http://127.0.0.1:45447/appservice/__dev__/WAService.js:20:469)

          at Function.<anonymous> (http://127.0.0.1:45447/appservice/__dev__/WAService.js:20:3006)

          at L.<anonymous> (http://127.0.0.1:45447/appservice/__dev__/WAService.js:19:1500)



      如果将skip(0)修改为skip(1),即

      db1.collection('BSDX3S1D1KZC').skip(1).limit(60).get()

      .then(console.log)

      .catch(console.error)


      读出来的 只有20条记录,无法全读出

      {data: Array(20), errMsg: "collection.get:ok"}


      请您再帮助看下,谢谢!


      2018-11-09
      回复
    • 半寸灰
      半寸灰
      2018-11-09回复

      小程序端的 limit上限是20


      云函数的是100

      建议一次读用云函数

      2018-11-09
      2
      回复
    • 2018-11-09回复半寸灰

      好的,多谢!

      2018-11-09
      回复
    • 2018-11-09回复半寸灰

      向您请教在前端多次 读取 云数据库的中的集合中的数据时, 可不可以在前端用async /await 的机制来保证各次读取的顺序是 确定的?如果可以,怎样来实现?

      2018-11-09
      回复
    • 半寸灰
      半寸灰
      2018-11-10回复

      云函数可以  小程序端  需要转译  或者 第三方框架

      2018-11-10
      回复
    查看更多(6)
登录 后发表内容