当前位置: 首页 > news >正文

mongodb如何多表查询,如同时查询店铺以及里面对应的商品

多表查询场景介绍

        一种很常见的场景,比如电商首页中,需要同时展示最近比较火热的店铺,以及直接展示店铺里对应的商品。或者用户下单之后购物车里可以看到所选的商品以及对应的店铺。如果不知道如何用mongodb自带的查询语句快速查询的话,我们能有的实现方案,可能是先查询店铺,然后通过for循环再查询店铺里的商品,而for循环是会反复操作数据库,对性能有极大的损耗,并且速度也非常的慢,所以这里我们来学习一下如何用mongodb来多表查询。

多表查询操作

aggregate集合函数与$lookup的使用

一下以疾病分类与对应的产品表为例代码如下:

db.disease_type.aggregate([{$lookup: {from: 'product',localField: '_id',foreignField: 'disease_type_id',as: 'products',},}])

aggregate为集合函数

$lookup 操作符将多个文档合并为一个数组

from 则为要被关联查询的表,比如的product则为产品表

localField 为当前表的id,也就是disease_type表的id

foreignField 为被关联表的要与当前表对应的id,也就是product的disease_type_id自带与disease_type表的_id字段进行关联

as 则是将这个被关联的表存放到那个字段中。

整个数据结构会自动拼接好,最终结果如下图,

$unwind数据结构与$project数据过滤

如果每个产品都对应一个分类,则用unwind改变数据结构代码如下:

db.disease_type.aggregate([{$lookup: {from: 'product',localField: '_id',foreignField: 'disease_type_id',as: 'products',}},{$unwind:"$products"},{$project: {_id: 1,date: 1,products: {_id: 1,name: 1,price: 1,}}}])

注意这里的products名称必须与上面的as要一致,否则也会找不到结果。

而$project则是过滤字段,只展示指定的内容。如果想展示所有则去掉此属性即可。

结果如下:

$map自定义结构

$project可以配置要展示的哪些字段,但有时候字段的名称可能要修改调整一下。比如_id改为id或者可自己配置各种结构

db.disease_type.aggregate([{$lookup: {from: 'product',localField: '_id',foreignField: 'disease_type_id',as: 'products',}},{$project: {_id: 1,date: 1,products: {$map: {input: '$products',as: 'product',in: {_id: '$$product._id',parentId:"$products._id",name: '$$product.name',price: '$$product.price',}}}}}])

$map 重新遍历循环

input 里的$products则表示商品表数据

as 里的product则表示被遍历的每个数据(类似for(item in products))。而只要被as处理之后,就可以通过$$product的方式调用这个变量了。

in 则表示商品列表内部结构的配置,比如还需配置parentId,这里的name,price等key字段都可以自己重命名,要绑定的字段则可通过$$product来绑定。

如下图

分页与模糊查询

        以上功能都是查询的所有数据,但我们实际运用中还需要分页或者通过关键字筛选。可继续在数组里添加其他条件,代码如下

db.disease_type.aggregate([{$lookup: {from: 'disease',localField: '_id',foreignField: 'disease_type_id',as: 'products',},},{$unwind: '$products'},{$match: {'products.name': {$regex: name,$options: 'i'},},},{$skip: start,},{$limit: limit,}])

$match 则是对某些字段添加过滤条件,而里面的$regex则表示用正则去匹配

$skip与$limit 则表示从那段开始过滤后面多少条数据

mongoose插件调用

创建表model

let nodeSchema = new mongoose.Schema(config);
client = mongoose.model('disease_type', nodeSchema, 'disease_type');

执行mongo语句

 client.aggregate([{$lookup: {from: 'disease',localField: '_id',foreignField: 'disease_type_id',as: 'products',},},{$unwind: '$products'},{$match: {'products.name': {$regex: name,$options: 'i'},},},{$skip: start,},{$limit: limit,}]).exec((err, result) => {if (err) {console.error(err);response.error(ctx, err)return;}console.log(result);response.success(ctx, result)});

exec函数则会将查询到的结果数据返回给result

相关文章:

mongodb如何多表查询,如同时查询店铺以及里面对应的商品

多表查询场景介绍 一种很常见的场景,比如电商首页中,需要同时展示最近比较火热的店铺,以及直接展示店铺里对应的商品。或者用户下单之后购物车里可以看到所选的商品以及对应的店铺。如果不知道如何用mongodb自带的查询语句快速查询的话&#…...

Linux环境修改服务器时间和网络时间保持一致

目录 介绍UTC和CST 修改时区 修改时间 介绍UTC和CST UTC是协调世界时,是全球统一的时间标准。UTC的时间是基于原子钟计算的,以秒为单位,不受夏令时等影响。世界各地都可以通过UTC来同步时间。 CST是中央标准时间,相当于UTC-6…...

CUDA学习笔记6——事件计时

事件计时 CUDA事件是直接在GPU上实现的,因此它们不适用于对同时包含设备代码和主机代码的混合代码计时。 cudaEventCreate 创建一个事件cudaEventRecord 记录一个事件cudaEventElapsedTime 计算两个事件之间经历的时间,第一个参数为某个浮点变量的地址…...

使用vscode调试ffmpeg源码

ffmpeg的编译配置 # --enable-debug 设置为调试级别 # --disable-stripping 如果不加此选项,会strip去掉符号信息 ./configure --prefix{output_path} --enable-debug --disable-stripping make -j10VSCode的配置 将以下文件对比替换工程.vscode目录下的相同文件 …...

微信小程序--数字化会议OA系统之首页搭建

一、Flex弹性布局 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C提出了一种新的方案—-Flex布局,可…...

代码随想录算法训练营第六十天 | 739. 每日温度、496.下一个更大元素 I

739. 每日温度 链接: 代码随想录 (1)代码 496.下一个更大元素 I 链接: 代码随想录 (1)代码...

WebView 以及如何测试

混合应用 顾名思义,它们是本机应用程序和 Web 应用程序的混合体。它们可以在应用程序商店中下载,并且需要像本机应用程序一样从设备进行访问身份验证,但它们也有一个嵌入在应用程序中的浏览器(WebView)用于呈现 HTML。…...

Jetpack:013-Jetpack底部导航栏

文章目录 1. 概念介绍2. 使用方法2.1 NavigationBar2.2 NavigationBarItem 3. 示例代码3.1 代码和注释3.2 代码难点3.3 运行效果 4. 内容总结 我们在上一章回中介绍了Jetpack中弹出菜单相关的内容,本章回中将介绍 底部导航栏。闲话休提,让我们一起Talk …...

MATLAB - excel 读取

matlab中excel 读取 1. 写入excel文件 - xlswrite2. 读取excel文件 - xlsread 1. 写入excel文件 - xlswrite xlswrite(filename,A,sheet,xlRange) % 写入字符串 % 注意事项:Str需要是Cell格式,否则一个字母占一格 % Str {‘abc’}; xlswr…...

【AIGC核心技术剖析】Hotshot-XL 一种 AI 文本转 GIF 模型(论文 + 代码:经过训练可与Stable Diffusion XL一起使用)

Hotshot-XL 是一种 AI 文本转 GIF 模型,经过训练可与Stable Diffusion XL一起使用。 Hotshot-XL 可以使用任何经过微调的 SDXL 模型生成 GIF。这意味着两件事: 您将能够使用您可能想要使用的任何现有或新微调的 SDXL 模型制作 GIF。 如果您想制作个性化主题的 GIF,您可以…...

2023年9月青少年软件编程(C 语言) 等级考试试卷(八级)

2023年9月青少年软件编程&#xff08;C 语言&#xff09; 等级考试试卷&#xff08;八级&#xff09; 第 1 题 最短路径问题 平面上有n个点&#xff08;n<100&#xff09;&#xff0c;每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。 若有连线&#xff0…...

MS17010(永恒之蓝)漏洞实战

曾因苦难多壮志&#xff0c;不教红尘惑坚心。 工具检测 实战过程 使用搜索命令&#xff0c;搜索ms17_010 search ms17_010 搜索网段中主机漏洞 use auxiliary/scanner/smb/smb_ms17_010 照例&#xff0c;show options 看一下配置 设置网段&#xff0c;run运行就行了 使用攻…...

ROS自学笔记十三:VScode的介绍和安装

Visual Studio Code&#xff08;简称VS Code&#xff09;是一款由Microsoft开发的免费、轻量级、开源的集成开发环境&#xff08;IDE&#xff09;。它支持多种编程语言&#xff0c;并且具有丰富的扩展系统&#xff0c;使得用户可以根据自己的需求自定义和扩展功能。 以下是VS …...

操作系统【OS】微内核

基本概念 微内核结构将操作系统划分为两大部分&#xff1a;微内核多个服务器微内核包含&#xff1a; 与硬件处理紧密相关的部分一些较基本的功能客户和服务器间的通信客户与服务器之间是借助微内核提供的消息传递机制来实现交互的 基本功能 进程管理 进程的通信、切换、调度…...

Ubuntu docker安装mysql

本文介绍如何在docker中安装mysql&#xff0c;之前有尝试过先在docker中安装一个ubuntu到镜像&#xff0c;然后进去再去安装mysql相关的东西&#xff0c;发现不行&#xff0c;这边整理一下一个可行的方式。 在下载镜像的时候&#xff0c;直接下载mysql镜像。 1.搜索镜像 doc…...

VSCode使用记录

一、安装 从官网 https://code.visualstudio.com 下载相应安装包 二、扩展&#xff1a;商店 Chinese (Simplified) (简体中文) Language Pack for Visual Studio CodeLive Serveropen in browserGitLens — Git superchargedRemote - SSHPrettier - Code formatterESLintpxt…...

正则表达式之学习笔记

正则表达式学习笔记 一、概念二、正则表达式组成三、常见的正则表达式3.1 .匹配任意字符3.2 * 匹配前一个字符的0个或多个实例3.3 ^ 匹配输入字符串的开头3.4 $ 匹配行尾3.5 [] 匹配字符集合\<\> 精确匹配符号 一、概念 正则表达式是由一系列特殊字符组成的字符串&#…...

Java String类

字符串转义符号为 \ 常见的转义字符 转移字符对应的英文是 escape character , 转义字符串&#xff08; Escape Sequence &#xff09; 字母前面加上捺斜线 "" 来表示常见的那些不能显示的 ASCII 字符 . 称为转义字符 . 如 \0,\t,\n 等&#xff0c;就称为转 义字…...

我的电子萝卜刀火了吗?

引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 笔者在上一篇文章《萝卜刀真的太危险了,于是我用Cocos做了一个》中说到因女儿从学校回来之后想要我给她买一把萝卜刀被我拒绝&#xff0c;但是又想要让她体验一下&#xff0c;因此用Cocos…...

git 查看本地秘钥

第一步&#xff1a; 1&#xff0c;打开终端或者命令行窗口&#xff0c;输入一下命令&#xff1a; cd ~/.ssh进入ssh目录 2&#xff0c;查看该目录下的所有文件&#xff0c;输入以下命令: ls -al该命令将显示ssh目录下的所有文件&#xff0c;包括秘钥文件和配置文件,如果不存…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...