【笔记】云开发聚合实现跨表查询、计算逻辑、判断权限
发布于 5 年前 作者 chaoqin 4038 次浏览 来自 分享

背景:

之前不会用聚合,因为数据库结构分为了用户表、帖子表、喜欢表。> 小程序端请求一次列表,要根据帖子列表,循环查询用户表,喜欢表,并且还要做一系列的逻辑处理,计算当前帖子的权限、是否喜欢过、管理权限等信息。

效果:

之前: 上百行代码,多次查询,需要单独判断函数,处理时间在3000ms以上
之后:一行代码,一次查询,直接查询时算出权限,处理时间在300ms以内

数据库结构

代码实现:

let query = [{
        //0我的
        '_openid': OPENID
      },
      {
        //1公开
        public: true
      },
      {
        //2喜欢
        likes: db.command.all([OPENID])
        // likes: $.in([OPENID, '$likes'])
      },
      {
        //3本周
        createTime: $.gte(['$createTime', getCurDate('weekStart')])
        // createTime: _.gte(getCurDate('weekStart'))
      }, {
        //4帖子
        _id: event.id
      }
      ]
//判断查询条件
let listData = await db.collection('post').aggregate()
        .match(query[event.listType])
        .sort({
          createTime: -1
        })
        .skip(20 * (event.pageNum - 1))
        .limit(20)
        .lookup({
          from: "user",
          localField: "_openid",
          foreignField: "_id",
          as: "postList"
        })//和用户表关联
        .replaceRoot({
          newRoot: $.mergeObjects([$.arrayElemAt(['$postList', 0]), '$$ROOT'])
        })//将用户表信息放到根节点上
        .addFields({
          day: $.dayOfMonth('$createTime'),
          month: $.month('$createTime'),
          year: $.year('$createTime'),
          time: $.dateToString({
            date: '$createTime',
            format: '%Y年%m月%d日'
          }),
          isLike: $.in([OPENID, '$likes']), //判断这个帖子是否喜欢
          isLiked: $.in([OPENID, '$liked']), //判断这个帖子是否喜欢过
          isAuthor: $.eq(['$_openid', OPENID]), //判断这个帖子是否为作者
          isAdmin: $.eq([OPENID, 'oy0T-4yk7lCRFGDefpFC4Yvx_ppU']),//判断是否有管理员权限
          like: $.size('$likes'), //喜欢数
        })
        .project({
          postList: 0,
          userInfo: 0,
          liked: 0,
          likes: 0,
          city: 0,
          province: 0,
          country: 0,
          language: 0,
          nlp: 0,
          saveType: 0,
        })//清除掉不需要的字段
        .end()
1 回复

这个不错,可以加社区精华

回到顶部