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

08、MongoDB -- MongoDB 的 集合关联($lookup 和 DBRef 实现集合关联)

目录

  • MongoDB 的 集合关联
    • 演示前提:
      • 登录单机模式的 mongodb 服务器命令
      • 登录【test】数据库的 mongodb 客户端命令
      • 登录【admin】数据库的 mongodb 客户端命令
    • SQL 术语 与 Mongodb 的对应关系
    • 使用 $lookup 实现集合关联
      • 语法格式
      • 添加测试数据
      • 1、查询出订单数量大于6,及其对应的商品:
        • 1-1:查询出订单中,【amount】数量大于6的订单
        • 1-2:查询出订单中,【amount】数量大于 6 的订单,及其对应的商品
          • 查询命令
          • 命令解释
          • 查询结果
      • 2、查询出价格为 30 的商品所关联的全部订单
        • 2-1:查询【item】集合中价格为 30 的商品:
        • 2-2:查询出价格为 30 的商品所关联的全部订单
          • 查询命令
          • 命令解释
          • 查询结果
    • 使用 DBRef 实现集合关联
      • 语法格式
      • 添加测试数据
      • 1、查询标题为 “标题2" 的 comment 及对应的商品
        • 1-1:查询标题为 “标题2" 的 comment
          • 查询命令
          • 查询结果
        • 1-2:查询标题为 “标题2" 的 comment 文档 及 对应的商品
          • 查询返回的文档只有一条数据:
            • 查询命令:
            • 查询结果
          • 查询返回的文档有多条数据:
            • 查询命令
            • 查询结果

MongoDB 的 集合关联

演示前提:


登录单机模式的 mongodb 服务器命令

mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf"

在这里插入图片描述


登录【test】数据库的 mongodb 客户端命令

mongo mongodb://192.168.0.107:27017/test -u LJHAAA -p 123456

在这里插入图片描述


登录【admin】数据库的 mongodb 客户端命令

mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456

在这里插入图片描述


SQL 术语 与 Mongodb 的对应关系


在这里插入图片描述


使用 $lookup 实现集合关联


语法格式

在聚集运算使用如下文档:

   {$lookup:{from: 指定要连接的集合localField: 指定本集合中文档的主键字段foreignField: 指定要连接的集合中的外键字段as: 指定被连接对象的属性名}}

localField 和 foreignField 指定两个集合之间的关联条件


添加测试数据

原本的 item 集合有这些数据

在这里插入图片描述

价格为 30 的【键盘】,和 订单 1、2、3相关联;
价格为 60 的【鼠标】,和 订单 4、5 相关联;

db.order.insert([{item_id:  ObjectId("65e6cb5e055c945aa89b8575"), name: "订单1", amount: 3},{item_id:  ObjectId("65e6cb5e055c945aa89b8575"), name: "订单2", amount: 5},{item_id:  ObjectId("65e6cb5e055c945aa89b8575"), name: "订单3", amount: 8},{item_id:  ObjectId("65e6cb5e055c945aa89b8578"), name: "订单4", amount: 4},{item_id:  ObjectId("65e6cb5e055c945aa89b8578"), name: "订单5", amount: 7}
])

如图:生成一个【order】的订单集合,相当于sql的订单表。

在这里插入图片描述


1、查询出订单数量大于6,及其对应的商品:


1-1:查询出订单中,【amount】数量大于6的订单

在这里插入图片描述


1-2:查询出订单中,【amount】数量大于 6 的订单,及其对应的商品

查询命令
 db.order.aggregate([{$match: {amount: {$gt: 6}}},{ $lookup: {from: "item",localField: "item_id",foreignField: "_id",as: "item_detail"}}
])

命令解释
 db.order.aggregate([                  //aggregate 表示对 MongoDB 中的 order 集合执行聚集运算{$match: {amount: {$gt: 6}}},      //这是聚合管道中的第一个阶段,相当于where 条件:查询 amount > 6 的订单     { $lookup:                        // 这是聚合管道中的第二个阶段,使用 $lookup 操作符来执行关联查询{from: "item",               //指定要连接的集合,这里是连接【item】这个集合(表)localField: "item_id",      // 指定当前集合(order)中用于关联的字段为 item_idforeignField: "_id",        //指定要关联的集合(item)中用于关联的字段为 _idas: "item_detail"           //指定将关联查询的结果存储到名为 item_detail 的字段中}}
])

相当于 SQL 中的 join 查询:

select * from order o  
join  item i  on o.item_id = i . _id 
where o.amout > 6;

在这里插入图片描述


查询结果

在这里插入图片描述


2、查询出价格为 30 的商品所关联的全部订单


2-1:查询【item】集合中价格为 30 的商品:
db.item.aggregate([{$match:{price:30}}
])

在这里插入图片描述


2-2:查询出价格为 30 的商品所关联的全部订单
查询命令
db.item.aggregate([{$match: {price: 30}},{$lookup: {from: "order",localField: "_id",foreignField: "item_id",as: "order_array"}}
])

命令解释
db.item.aggregate([{$match: {price: 30}},             //这是聚合管道中的第一个阶段,用于筛选出【item】集合中 price 等于 30 的 数据{$lookup: {    			        //这是聚合管道中的第二个阶段,使用 $lookup 操作符来执行关联查询from: "order",            //指定要关联查询的集合为 orderlocalField: "_id",        //指定当前集合(item)中用于关联的字段为 _idforeignField: "item_id",  //指定要关联的集合(order)中用于关联的字段为 item_idas: "order_array"         //指定将关联查询的结果存储到名为 order_array 的字段中}}
])

查询结果

在这里插入图片描述


使用 DBRef 实现集合关联


语法格式

DBRef 尽可能地模拟了SQL数据库中外键——指定要引用哪个表的哪个列。

插入文档时使用 DBRef 引用其他文档,DBRef 的完整形式:

{ $ref : 被引用的集合名 , $id : 被引用的文档主键< value > , $db : 被引用的数据库 }

如果被引用的集合在同一个数据库中,$db 可以省略。

通过 DBRef 的 fetch() 方法即可抓取关联文档。


添加测试数据

db.comment.insert([{item:  {$ref: "item", $id: ObjectId("65e6cb5e055c945aa89b8575")}, title: "标题1", body: "评论内容1"},{item:  {$ref: "item", $id: ObjectId("65e6cb5e055c945aa89b8575")}, title: "标题2", body: "评论内容2"},{item:  {$ref: "item", $id: ObjectId("65e6cb5e055c945aa89b8575")}, title: "标题3", body: "评论内容3"},{item:  {$ref: "item", $id: ObjectId("65e6cb5e055c945aa89b8575")}, title: "标题4", body: "评论内容4"},{item:  {$ref: "item", $id: ObjectId("65e6cb5e055c945aa89b8575")}, title: "标题5", body: "评论内容5"}
])

item: 这是一个嵌套的字段,包含了一个引用到 item 集合中某个文档的信息。

$ref: “item”: 指定了引用的集合为 item。

$id: ObjectId(“65e6cb5e055c945aa89b8575”): 指定了引用的文档的 ObjectId。

如图:引用了 item 集合中的 id 为 【65e6cb5e055c945aa89b8575】 的文档

在这里插入图片描述


测试数据:

在这里插入图片描述


1、查询标题为 “标题2" 的 comment 及对应的商品


1-1:查询标题为 “标题2" 的 comment

查询命令
db.comment.findOne({title: "标题2"})

查询结果

在这里插入图片描述


1-2:查询标题为 “标题2" 的 comment 文档 及 对应的商品

【备注】如果你已经用了 DBRef 来记录关联,程序可以非常方便处理关联,压根不需要使用 $lookup


查询返回的文档只有一条数据:

查询命令:
db.comment.findOne({title: "标题2"}).item.fetch()

查询结果

在 studio 3t 这个图形界面工具查询就出错。

在这里插入图片描述


修改成这样:

db.comment.findOne({title: "标题2"}, {item: 1})

在这里插入图片描述


在命令行窗口查询就可以

在这里插入图片描述


在这里插入图片描述


查询返回的文档有多条数据:

如果查询的包含了多个文档,且要通过DBRef获取关联文档时,
由于 find() 方法返回的是 DBCursor,因此需要先遍历 DBCursor,然后在通过查询文档的关联属性来获取关联的文档。

DBCursor 有一个 forEach 方法,该方法需要传入一个 JS 的 function( c ) {c就代表了正则遍历的文档},
通过该函数可对DbCursor中多个文档进行遍历。


查询命令
db.comment.find({title: "标题2"}).forEach(function(c){print(JSON.stringify(c) + JSON.stringify(c.item.fetch()));
})

查询结果

在这里插入图片描述

相关文章:

08、MongoDB -- MongoDB 的 集合关联($lookup 和 DBRef 实现集合关联)

目录 MongoDB 的 集合关联演示前提&#xff1a;登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 SQL 术语 与 Mongodb 的对应关系使用 $lookup 实现集合关联语法格式添加测试数据1、查询出订单数量大于6&a…...

前方高能,又一波Smartbi签约喜报来袭

近期&#xff0c;交通银行、厦门国际银行、中原农业保险、江苏中天科技等多家知名企业签约Smartbi&#xff0c;携手Smartbi实现数据驱动业务新增长。 Smartbi数10年专注于商业智能BI与大数据分析软件与服务&#xff0c;为各行各业提供提供一站式商业智能平台&#xff08;PaaS&a…...

蓝桥杯倒计时 41天 - 二分答案-最大通过数-妮妮的月饼工厂

最大通过数 思路&#xff1a;假设左边能通过 x 关&#xff0c;右边能通过 y 关&#xff0c;x∈[0,n]&#xff0c;通过二分&#xff0c;在前缀和中枚举右边通过的关卡数&#xff0c;保存 xy 的最大值。 #include<bits/stdc.h> using namespace std; typedef long long ll…...

【JavaSE】泛型

系列文章目录 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 学习泛型之前请大家先详细地了解一下&#xff0c;关于Java…...

APS(高级计划与调度系统)难度超高,ERP在它面前就是弟弟。

一、APS定义和功能模块 APS系统是Advanced Planning and Scheduling System&#xff08;高级计划与调度系统&#xff09;的缩写。它是一种计划和调度管理软件系统&#xff0c;旨在帮助企业优化生产计划和资源调度&#xff0c;提高生产效率和响应能力。 APS系统利用先进的算法和…...

ArmV8架构

Armv8/armv9架构入门指南 — Armv8/armv9架构入门指南 v1.0 documentation 上面只是给了一个比较好的参考文档 其他内容待补充...

[论文笔记] Open-sora 2、视频数据集介绍 MSR-VTT

MSR-VTT COVE - Computer Vision Exchange 论文参考:https://www.microsoft.com/en-us/research/wp-content/uploads/2016/06/cvpr16.msr-vtt.tmei_-1.pdf 用于视频理解的大规模视频基准,特别是将视频翻译为文本的新兴任务。这是通过从商业视频搜索引擎收集 257 个热门查询…...

【Windows 常用工具系列 14 -- windows 网络驱动映射】

文章目录 windows 网络驱动映射 windows 网络驱动映射 映射网络驱动器的意思是将局域网中的某个目录映射成本地驱动器号。 在windows上将服务器目录映射到本地盘&#xff1a; 进入到服务器执行下面命令既可以看到对应的 IP地址&#xff1a; 将对应的IP地址填入上图中。 映…...

Java中使用Jsoup实现网页内容爬取与Html内容解析并使用EasyExcel实现导出为Excel文件

场景 Pythont通过request以及BeautifulSoup爬取几千条情话&#xff1a; Pythont通过request以及BeautifulSoup爬取几千条情话_爬取情话-CSDN博客 Node-RED中使用html节点爬取HTML网页资料之爬取Node-RED的最新版本&#xff1a; Node-RED中使用html节点爬取HTML网页资料之爬…...

闫震海:腾讯音乐空间音频技术的发展和应用 | 演讲嘉宾公布

一、3D 音频 3D 音频分论坛将于3月27日同期举办&#xff01; 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验&#xff0c;跨越时空的限制&#xff0c;探索未知的世界。同时&#xff0c;提供更加丰富、立体的情感表达和交流方式&#xff0c;让人类能够更加深入地理解彼此&…...

Java基础 - 6 - 面向对象(二)

Java基础 - 6 - 面向对象&#xff08;一&#xff09;-CSDN博客 二. 面向对象高级 2.1 static static叫做静态&#xff0c;可以修饰成员变量、成员方法 2.1.1 static修饰成员变量 成员变量按照有无static修饰&#xff0c;分为两种&#xff1a;类变量、实例变量&#xff08;对象…...

SpringCloud-MQ消息队列

一、消息队列介绍 MQ (MessageQueue) &#xff0c;中文是消息队列&#xff0c;字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。消息队列是一种基于生产者-消费者模型的通信方式&#xff0c;通过在消息队列中存放和传递消息&#xff0c;实现了不同组件、服务或系统…...

代码随想录算法训练营第三十八天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

509. 斐波那契数 刷题https://leetcode.cn/problems/fibonacci-number/description/文章讲解https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE视频讲解https://www.bilibili.com/video/BV…...

[python] 代码工具箱

在 Python 3 的开发过程中&#xff0c;有一些小而实用的工具包可以帮助减轻开发负担&#xff0c;提升工作效率。这些工具包通常专注于解决特定问题或提供特定功能&#xff0c;使代码更简洁和可维护。以下是一些常用的工具包&#xff0c;可以简化开发过程&#xff1a; backoff&a…...

Linux——网络基础

计算机网络背景 网络发展 独立模式: 计算机之间相互独立 在早期的时候&#xff0c;计算机之间是相互独立的&#xff0c;此时如果多个计算机要协同完成某种业务&#xff0c;那么就只能等一台计算机处理完后再将数据传递给下一台计算机&#xff0c;然后下一台计算机再进行相应…...

Vue:双token无感刷新

文章目录 初次授权与发放Token&#xff1a;Access Token的作用&#xff1a;Refresh Token的作用&#xff1a;无感刷新&#xff1a;安全机制&#xff1a;后端创建nest项目AppController 添加login、refresh、getinfo接口创建user.dto.tsAppController添加模拟数据 前端Hbuilder创…...

实现一个作用域插槽的场景

vue项目中&#xff0c;插槽slot有三种分别是&#xff1a;默认插槽、具名插槽、作用域插槽。默认插槽和具名插槽在平时的开发中用的比较多&#xff0c;作用域插槽用的相对较少&#xff0c;以前我对作用域插槽不是很理解&#xff0c;现在理解了一下。下面通过代码来实现一个作用域…...

Qt QPainter的使用方法

重点&#xff1a; 1.QPainter在QWidget窗口的paintEvent中使用。 2.QPainter通常涉及到设置画笔、设置画刷、绘图&#xff08;QPen、QBrush、drawxx&#xff09;三个流程。 class Widget : public QWidget {Q_OBJECTprotected:void paintEvent(QPaintEvent *event) Q_DEC…...

低代码:数智化助力新农业发展

随着科技的飞速发展和数字化转型的深入推进&#xff0c;低代码开发平台正逐渐成为软件开发的热门话题。尤其在农业领域&#xff0c;低代码技术为传统农业注入了新的活力&#xff0c;助力新农业实现高效、智能的发展。 低代码开发平台的概念与特点 随着科技的飞速发展&#xff0…...

3d模型怎么镜像?3d模型镜像的步骤---模大狮模型网

在3D建模软件中&#xff0c;对3D模型进行镜像操作通常是指沿着某个轴线(如X、Y、Z轴)进行镜像翻转&#xff0c;使模型在该轴线的一侧产生对称的镜像效果。以下是在常见的3D建模软件中对3D模型进行镜像的一般步骤&#xff1a; 3d模型镜像步骤&#xff1a; 选择模型&#xff1a;…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

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

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

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...