小程序云函数之嵌套查询

刚用云开发,我不知道小程序数据库有没有嵌套查询的语句,所以我只能用最笨的方法,查找出来循环再查找,好,接下来,问题就是,你查找出来了没有,查找出来的值是什么类型的值,我弄这个问题整整弄了一天,我刚开始直接在小程序端弄的,能弄出数据来,但是我这个好像是顺序查询,会出现延迟的情况,当我还没查询完就已经把数据显示出去了,导致我部分数据是没法显示出来的,因为我看到appData里面的数据刚以刷新页面的时候,数据是不完善的,只获取到了顺序查询中的第一个数据,后面的还全部没渲染出来,虽然我console.log(res)能显示全部数据,过一会点回appData,数据就又全部显示了,但是我的页面已经显示完了。所以我就认为它是数据延迟,我就觉得必须把所有查询出来再传值。这算不算同步?所以我就想到要在云函数中弄,这里有一个,对于新手来讲

每次修改了云函数中的代码,记得上传并部署,要不然就跟没改一样,一开始我以为上传一次就够了(新建它自动帮忙上传了),后面不管我怎么改都没显示出什么。

先说一下我嵌套查询的是什么吧

从一个group中获取到list(group),循环这个list(group),取得carid去表carMsg取得对应的carMag数据,再取得前条carMsg数据表中openid去获取user。不知道描述清楚了没有,group->carMsg->user,最后拼接我自己想要的数据,返回一个对象出来就好了,因为返回的可能是列表,所以,这个要注意。弄到想吐血。我的是列表,如果是单挑数据的就不用考虑把数据插入列表中,直接把查找出来的数据直接return就可以,接下来上代码:

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()
const db = cloud.database()
// 云函数入口函数
exports.main = async(event, context) => {
  const wxContext = cloud.getWXContext() // 这里获取到的 openId 和 appId 是可信的
  //直接通过wxcontext获取该用户的openid
  const openid = wxContext.OPENID
  //承载所有读操作的promise的数组
  const list = []

  //接下来是开始查询,先根据openid获取到相关的group,这里获取的是列表
  await db.collection('group').where({
    _openid: openid,
    group_reveal: 0
  }).get().then(res => {
    //循环查询到的列表,对每个列表进行对应数据的查询
    for (let i = 0; i < res.data.length; i++) {
      //per1用来定义最终的我想要的对象,插入结果list中的对象,根据对应的caricd得到carMsg对象
      let per1 = db.collection('carMsg').where({
        _id: res.data[i].carMsg
      }).get().then(ce => {
        //根据carMsg对象中的openid获得user对象
        return db.collection('user').where({
          _openid: ce.data[0]._openid
        }).get().then(ue => {
          //声明对象,为下面拼接对象用
          const per = {}
          //拼接自己想要的信息
          per.groupid = res.data[i]._id
          per.openid = res.data[i]._openid
          per.carid = res.data[i].carMsg
          per.endPoint = ce.data[0].carMsg.endPoint
          per.lowNum = ce.data[0].carMsg.lowNum
          per.estimate = ce.data[0].carMsg.estimate
          per.people = ce.data[0].carMsg.people
          per.nickName = ue.data[0].nickName
          per.avatarUrl = ue.data[0].avatarUrl
          // 返回对象
          return per
        })
      })
      //加入到列表中
      list.push(per1)
    }
  })

  return (await Promise.all(list))
}
//小程序端

 onLoad: function(options) {
    var that = this
     wx.cloud.callFunction({
      name:'groupMsg',   //这个是云函数名
      success:function(e){
        console.log("成功",e)
        that.setData({
          list:e.result  //设置值
        })
      },fail:function(e){
        console.log("失败", e)

      }
    })
  },

总感觉我写复杂了,刚开始我在(下面代码注释处)

for (let i = 0; i < res.data.length; i++) {

let per1 = db.collection('carMsg').where({

//这里_id: res.data[0].carMsg,我的0没换回i也是照样可以找出数据的,不知道为什么

_id: res.data[i].carMsg

}).get().then(ce => {

新手入坑,多多指教。

猜你喜欢

转载自blog.csdn.net/c1249629019/article/details/89293188