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

news2024/11/26 3:32:43

多表查询场景介绍

        一种很常见的场景,比如电商首页中,需要同时展示最近比较火热的店铺,以及直接展示店铺里对应的商品。或者用户下单之后购物车里可以看到所选的商品以及对应的店铺。如果不知道如何用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来绑定。

如下图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有限差分法

目录 1.原理介绍 1.1 有限差分法介绍 1.2 有限差分法步骤 2.案例分析 2.1 问题重述 2.2 问题求解 1.原理介绍 1.1 有限差分法介绍 有限差分法是一种常用的数值计算方法,用于求解偏微分方程或常微分方程的数值解。它的基本思想是将连续的空间区域离散化为有限…

mac电脑安装雷蛇管理软件,实现调整鼠标dpi,移动速度,灯光等

雷蛇官网只给了win版本驱动 mac版本驱动到这里下载: GitHub - 1kc/razer-macos: Color effects manager for Razer devices for macOS. Supports High Sierra (10.13) to Monterey (12.0). Made by the community, based on openrazer. 安装后会显示开发者不明,请丢弃到垃圾桶.…

Java:SpringBoot整合Spring Batch示例

目录 文档基础概念Tasklet方式示例Chunk方式示例参考文章 文档 https://docs.spring.io/spring-batch/docs/4.3.9/reference/html/index.html 基础概念 JobLauncher:作业启动器,启动作业的入口。对应的实现类为SimpleJobLauncher。Job:作业…

PLC通过Modbus转Profinet网关连接变频器控制电机配置案例

在本案例中,通过使用Modbus转Profinet网关(XD-MDPN100),PLC可以通过Profinet协议与变频器进行通信和控制。这样,PLC可以实现对电机的转速调节、启停控制等功能。 同时,通过Modbus转Profinet(XD-…

你还在为协同办公烦恼吗?试试视频协同办公吧!

在这个信息化、数字化的时代,协同办公已经成为了企业、团队的必备工具。然而,尽管传统的协同办公工具有诸多优点,但在实际使用中,仍会遇到各种各样的问题。你是否还在为这些问题而烦恼?别担心,让我们一起探…

【C++】函数重载 引用 内联函数

目录 一,函数重载 1,函数重载的概念 2,C支持函数重载的原理 二,引用 1,引用概念 2,引用特性 3,常引用 4,做参数 5,做返回值 6,传值、传引用效率比较…

【LeetCode(LeetCode刷题经典一百题)】:移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序 请注意 ,必须在不复制数组的情况下原地对数组进行操作 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出: [0] 方…

python二次开发CATIA:全约束草图

​约束的创建需要用到 Sketch 下面 Constraints 这个 Collection 的 Add 方法。该对象创建约束有三个方法:AddMonoEltCst, AddBiEltCst, AddTriEltCst,对应的功能分别为为单个元素创建约束(如固定 a) 、为两…

RHCE8 资料整理(一)

RHCE8 资料整理 第一篇 基本配置第1章 安装RHEL8第2章 基本命令的使用2.1 终端设置2.2 输入命令的语法2.3 介绍shell2.4 用户切换 第3章 了解linux分区及常用命令3.1 路径3.2 创建和删除目录3.3 cd3.4 拷贝和剪切3.5 常见命令归纳filewctouchlnalias/unaliascat/tac/nlmore/les…

世界粮食日:宏工科技有对策,赋能食品生产高效可持续发展

10月16日是世界粮食日。随着全球人口的增长,人们对高品质食品的需求也越来越大,如何实现“更好生产、更好营养”成为了食品生产与供应的重要话题。15年来,宏工科技专注物料处理自动化领域,提供食品物料处理一站式解决方案以提高生…

数字孪生技术如何提高化工生产安全性?

随着科技的不断进步,数字孪生技术已经渗透到了各个领域,为化工行业带来了翻天覆地的变革。这一技术的应用不仅在生产效率方面发挥了积极作用,还在安全性、创新、环保和可持续性等多个方面作出了巨大的贡献。 化工行业常常涉及危险品和复杂的生…

网络安全行业需要考哪些证书

一、NISP国家信息安全水平证书 国家信息安全水平考试(National Information Security Test Program,简称NISP),是由中国信息安全测评中心实施培养国家网络空间安全人才的项目。由国家网络空间安全人才培养基地运营/管理&#xff…

vue3 电子签名实现

vue电子签名可以通过vue-esign插件来实现: 第一步安装&#xff1a; npm install vue-esign 引用方式&#xff1a; 全局&#xff1a; 局部&#xff1a; // .vue 文件 import vueEsign form vue-esign 使用方式&#xff1a; <template><!-- 使用这个签名组件 --&…

WampServer下载安装并结合cpolar内网穿透实现本地服务的公网访问

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

爬虫ip如何加入到代码里实现自动化数据抓取

以下是一个使用HTTP:Tiny和www.weibo.com的音频爬虫程序的示例。这个示例使用了https://www.duoip.cn/get_proxy来获取爬虫IP。请注意&#xff0c;这个示例可能需要根据你的实际需求进行调整。 #!/usr/bin/perluse strict; use warnings; use HTTP::Tiny; use LWP::UserAgent; …

智能垃圾桶丨悦享便捷生活

垃圾桶是人们日常生活所必不可少的必需品&#xff0c;它让生活中所产生的垃圾有了一个正确的存放地方。随着生产技术的迅速发展&#xff0c;垃圾桶也得以更新换代。由最初的简单式的圆筒式垃圾桶&#xff0c;到现在出现的感应式垃圾桶、智能语音控制垃圾桶&#xff0c;垃圾桶也…

紫光展锐荣评“5G技术创新力企业”,5G赋能千行百业

近日&#xff0c;2023年第十七届中国通信产业榜隆重发布&#xff0c;紫光展锐凭借多年以来在通信和芯片技术上的积累&#xff0c;从众多参选者中脱颖而出&#xff0c;荣评“5G技术创新力企业”&#xff0c;并蝉联2023年通信产业榜“中国通信设备技术服务供应商100强”。 作为一…

2023年中国求职招聘类APP行业现状及市场格局分析[图]

求职招聘类APP行业涉及互联网信息技术行业、人力资源行业&#xff0c;受到多个部门的监督管理&#xff0c;包括国家互联网信息办公室、工业与信息化部、人社部、商务部等。 中国人力资源市场正朝着信息化、数字化的方向不断发展。新兴技术赋能将大幅提升服务效率&#xff0c;我…

分享成功实施RPA(机器人流程自动化)的关键要素和经验技巧

在当今数字化时代&#xff0c;RPA&#xff08;机器人流程自动化&#xff09;已经成为企业组织提高效率、降低成本和提高竞争力的强大工具&#xff0c;各行各业都在寻找创新方式来实现业务自动化。但RPA的成功实施并非轻而易举&#xff0c;它需要精心策划和明智决策。本文&#…

list.set交换数据需要(or不需要)添加其他中间变量,两个例子告诉你

说明&#xff1a;set()方法是来修改指定位置的元素。 两个参数&#xff0c;第一个参数是要修改的元素的索引&#xff0c;第二个参数是要设置的新值。 案例一&#xff1a;当链表中传入的是字符串时&#xff1a; public static void main(String[] args) {List list new Linke…