小程序云开发多表查询

2023-11-08

原文链接:https://juejin.im/post/5baadb086fb9a05ce2740968

关联表学习

文中代码并不是实际代码,伪代码不可直接运行。

功能:用户 喜欢 文章

  1. 用户表(users)

    id username
    唯一标识,没有登录的可直接使用 _openid 用户名
  2. 文章表(articles)

    id title content
    唯一标识 标题 内容
  3. 关联表(relation)

    index userId articleId
    唯一索引 用户 ID 文章 ID

用户喜欢文章时,向 relation 添加一条数据,

用户取消喜欢时,从 relation 删除对应的数据。

需求

  1. 查询文章列表,返回文章标题、喜欢人数、用户是否喜欢

    第一步:先查询出文章列表

  2. 
    select * from articles
    
    第二步:遍历文章列表,查询关联表得到用户是否喜欢、喜欢人数
    
    for (article : articles) {
    
        isLike = ( select * from relation where articleId = article.id && userId = 'userId' )
    
        likeCount = ( select count(*) from relation where articleId = article.id )
    
        article.isLike = isLike
    
        article.likeCount = likeCount
    
    }
    
    
    
    const db = cloud.database()
    
     
    
    const getArticles = async (event, context) => {
    
        const { userInfo: { openId } } = event
    
        return db.collection('articles').get().then(({ data }) => {
    
            let articles = []
    
            for (let i = 0, length = data.length; i < length; ++i) {
    
                await Promise.all([
    
                    db.collection('relation').where({
    
                        articleId: data[i].id,
    
                    }).count(),
    
                    db.collection('relation').where({
    
                        articleId: data[i].id,
    
                        userId: openId,
    
                    }).count()
    
                ]).then(([likeCount, liked]) => {
    
                    articles.push({
    
                        ...data[i],
    
                        likeCount,
    
                        liked: !!liked,
    
                    })
    
                })
    
            }
    
            return {
    
                data: articles,
    
                message: 'success',
    
            }
    
        }).catch( err => {
    
            console.error(err.errMsg)
    
            return Promise.reject({
    
                data: [],
    
                message: err.errMsg,
    
            })
    
        })
    
    }
    
    

    2.查询用户喜欢的文章列表,返回文章标题、喜欢人数

    第一步:查询关联表得到用户喜欢的文章 ID 数组

    
    select articleId from relation where userId = 'userId'
    

    第二步:遍历文章 ID 数组,查询文章表得到标题

    
    res = [] // 最终结果
    
    for (id : articleIds) {
    
        details = ( select * from articles where articleId = id )
    
        likeCount = ( select count(*) from relation where articleId = id )
    
        res.push({
    
            articleId: id,
    
            title: details.title,
    
            likeCount: likeCount,
    
        })
    
    }
    
    
    
    
    const db = cloud.database()
    
    const _ = db.command
    
     
    
    const getFavArticles = async (event, context) => {
    
        const { userInfo: { openId } } = event
    
        return db.collection('relation').where({
    
            userId: openId,
    
        }).field({
    
            articleId: true,
    
        }).get().then(({ data }) => {
    
            return db.collection('articles').where({
    
                id: _in(data.map( item => item.articleId )),
    
            }).then(({ data: articles }) => {
    
                let result = []
    
                for (let i = 0, length = articles.length; i < length; ++i) {
    
                	await db.collection('relation').where({
    
                        articleId: articles[i].id,
    
                    }).count().then(({ total }) => {
    
                        result.push({
    
                            ...articles,
    
                            likeCount: total,
    
                        })
    
                    })
    
            	}
    
                return {
    
                    data: result,
    
                    message: 'success',
    
                }
    
            })
    
        }).catch( err => {
    
            console.error(err)
    
            return Promise.reject({
    
                data: [],
    
                message: err.errMsg,
    
            })
    
        })
    
    }
    
    复制代码
    

    3.查询文章详情,返回文章标题、内容、喜欢人数、用户是否喜欢


select title, content, likeCount from articles

select count(*) from relation where articleId = 'articleId' && userId = 'userId'

 


const db = cloud.database()

 

const getArticleDetails = (event, context) => {

    const { userInfo: { openId }, id } = event

    return Promise.all([

        // 如果直接使用微信自带的 _id 索引可直接使用

        // db.collection('articles').doc(id)

        db.collection('articles').where({ id }),

        db.collection('relation').where({

            userId: openId,

            articleId: id,

        }).count()

    ]).then(([details, total]) => {

        // 注意使用 where 查询后这里的 details 是个数组

        if (details.length) {

            return {

                data: {

                    ...details[0],

                    liked: !!total,

                },

                message: 'success',

            }

        }

    }).catch( err => {

        console.error(err)

        return Promise.reject({

            data: {},

            message: err.errMsg,

        })

    })

}

复制代码

小程序地址

转载于:https://juejin.im/post/5baadb086fb9a05ce2740968

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小程序云开发多表查询 的相关文章

  • 华为AP胖瘦模式转换步骤

    华为AP胖瘦模式转换步骤 以AP3010DN AGN为例 瘦模式转换为胖模式 1 待AP启动完成后 从console口登录 波特率为9600 账号默认为admin 密码为admin huawei com 2 登录成功后 AP默认的IP地址为
  • python3+selenium调用浏览器驱动时报错的解决方法

    如题 在python3环境中使用selenium 在调用浏览器驱动时 报错 报错信息如图 报错原因是因为chromeDriver驱动需要与相应的chrome浏览器版本号相对应 解决方法 检查一下浏览器版本号 当前小编的chrome浏览器版本
  • corrupted double-linked list: 0x086a6c50(内存问题)

    新增了一段代码 程序就直接异常了 但是新增的代码没什么问题 但是在qt里面只显示异常也看不出是什么原因导致的 在终端运行了下 就提示有这个错误了 上网搜了一下 是内存的问题 通常有以下容易犯的内存问题 1 内存重复释放 出现double f
  • HTTP快速入门+(请求消息数据格式)+ 防盗链分析

    HTTP 概念 Hyper Text Transfer Protocol 超文本传输协议 传输协议 定义了 客户端和服务器端通信时 发送数据的格式 特点 1 基于TCP IP的高级协议 2 默认端口号 80 3 基于请求 响应模型的 一次请
  • struts2的国际化[三种语言的动态切换]

    一 创建三个资源文件 crms zh CN properties crms en US properties crms zh TW properties 二 struts2的配置文件
  • 远程桌面遇到的问题

    1 Remote Desktop Services服务灰色无法启动 Win R 打开运行 键入 services msc 打开服务界面 找到 Remote Desktop Services 服务 双击打开 确认服务名称为 TermServi

随机推荐

  • Verilog学习心得之三-----task与function的区别

    task和function说明语句分别用来定义任务和函数 特点 1 利用任务和函数可以把一个很大的程序模块分解成许多小的任务和函数 便于理解和调用 2 输入 输出和总线信号的值可以传入 传出任务和函数 3 任务和函数往往还是在程序模块中在不
  • LVGL 源码分析大全

    LVGL 源码分析大全目录 1 概述 2 已完成源码分析文章列表 2 1 硬件抽像层 hal 2 2 核心框架 core misc 2 3 定制功能 2 4 内部接口 2 5 案例讲解 2 6 其它 3 样式 4 组件 5 主题 6 开发环
  • Linux的10个最危险的命令

    Linux命令行佷有用 很高效 也很有趣 但有时候也很危险 尤其是在你不确定你自己在正在做什么时候 这篇文章将会向你介绍十条命令 但你最好不要尝试着去使用 当然 以下命令通常都是在root权限下才能将愚蠢发挥到无可救药 在普通用户身份下 破
  • Docker关闭容器命令(docker stop)

    关闭容器 一定要是容器的名称 也就是 NAMES 下面的名称 关闭容器 docker stop 容器名称 非root用户 关闭容器 sudo docker stop 容器名称
  • Android Studio在build时一直停在:gradle: download maven-metadata.xml

    AndroidStudio在gradle build时 一直停在 gradle download maven metadata xml 解决 如果使用阿里云maven 看看使用的是不是旧版的maven 如果是 则更新为新版本的仓库地址 新版
  • Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 --SLAM不学无术小问题

    Ubuntu18 04 安装速腾聚创最新驱动RSLidar SDK采集XYZIRT格式的激光点云数据 新款驱动支持RS16 RS32 RSBP RS128 RS80 RSM1 B3 RSHELIOS等型号 注意 该教程旨在引导安装 可能现在
  • C#相等性比较

    本文阐述C 中相等性比较 其中主要集中在下面两个方面 和 运算符 什么时候它们可以用于相等性比较 什么时候它们不适用 如果不使用 那么它们的替代方式是什么 什么时候 需要自定一个类型的相等性比较逻辑 在阐述相等性比较 以及如何自定义相等性比
  • npm常用命令

    一 npm更新所有依赖最新版本 安装组件 npm install g npm check updates 查看所有依赖最新版本 ncu 更新所有依赖到最新版本 ncu u 二 查看单个依赖版本 npm info 依赖包名称 version
  • 【ChatGPT本地部署-- ChatGLM】

    这里写自定义目录标题 ChatGPT本地部署 ChatGLM 转载 一 什么是ChatGLM 二 本地部署 三 模型与ChatGPT和GPT4AII 效果对比 ChatGPT本地部署 ChatGLM 转载 目录 一 什么是ChatGLM 二
  • golang cli_Go CLI教程:财富克隆

    golang cli I ve written two CLI app tutorials to build gololcat and gocowsay In both I used fortune as the input generat
  • 解决smplayer中文字幕乱码

    首先 打开选项 gt 首选项 选择字幕选项卡 找到 默认字符编码 选项 在下拉框中选择 简体中文 cp936 再打开 字体和颜色 页卡 上边 选择 系统字体 在下拉选框中选择一种简体中文字体 转载于 https www cnblogs co
  • 追忆我那为之奋斗了5年的地方

    虽然已经下定决心离开 但是当邮件发出那一刻 我的手还是忍不住的发抖 心跳在不停的加速 这毕竟是我工作了5年的地方 这里有我熟悉的面孔 直到过了几分钟 Boss回了个信息 过来下 我才深吸一口气 缓缓的走向他的办公室 追忆 初入职顺利过关斩将
  • Linux 编译安装 openssl库

    Linux 编译安装 openssl库 如果是不需要特定版本的openssl库的安装非常简单 直接sudo apt install opensll即可 而且像Ubuntu这种应该是自带了openssl库的 运行openssl version
  • vmware启动虚拟机黑屏解决办法

    以管理员身份在命令提示符窗口中输入 netsh winsock reset 然后重启计算机即可解决
  • stm32每周学习报告2.0

    STM32 通用定时器简介 STM32 的通用定时器是一个通过可编程预分频器 PSC 驱动的 16 位自动装载计数器 CNT 构成 STM32 的通用定时器可以被用于 测量输入信号的脉冲长度 输入捕获 或者产生输出波 形 输出比较和 PWM
  • SQL之视图、变量、存储过程、函数

    视图 虚拟表 和正常表一样使用 视图的好处 修改视图 方式一 视图不存在就创建 存在就替换 create or replace view name as select 方式二 alter view name as select 删除视图 d
  • 简单运行C程序的步骤和方法

    1 安装C Free程序 如下图可见 2 新建一个源程序 点击左上角 文件 然后选择新建 进行命名 3 开始编译程序 以This is a C program 为例 4 点击编译 并开始运行 如出现错误和警告 系统会给予提醒 改正后就可以运
  • C语言函数大全-- v 开头的函数

    v 开头的函数 1 va start 1 1 函数说明 1 2 演示示例 1 3 运行结果 2 va arg 2 1 函数说明 2 2 演示示例 3 va copy 3 1 函数说明 3 2 演示示例 4 va end 4 1 函数说明 4
  • 【Clion+CubeMX开发STM32】(三)为你的工程创建GIT远程仓库

    目录 下载安装git 链接github远程仓库 上传 下载安装git 网上已经有很多git的安装教程 本文就不再赘述了 推荐一个链接 下载安装Git链接 链接github远程仓库 一 注册你的Git账号并登录 二 创建远程仓库 填写仓库名
  • 小程序云开发多表查询

    原文链接 https juejin im post 5baadb086fb9a05ce2740968 关联表学习 文中代码并不是实际代码 伪代码不可直接运行 功能 用户 喜欢 文章 表 用户表 users id username 唯一标识