MongoDB的数据库引用

在这里插入图片描述

本文主要介绍MongoDB的数据库引用。

目录

  • MongoDB的数据库引用

MongoDB的数据库引用

MongoDB是一种面向文档的NoSQL数据库,它使用BSON(Binary JSON)格式存储和查询数据。在MongoDB中,数据库引用是一种特殊的数据类型,用于建立不同集合之间的关联。

数据库引用通常以文档中的字段形式存在,在MongoDB中,$ref、$id和$db是数据库引用(DBRef)的三个关键字段。

  • $ref字段指定了引用的集合名称。它是一个字符串,用于指示引用的是哪个集合。
  • $id字段指定了引用文档的主键值。它可以是任何类型,但通常是一个ObjectId。
  • $db字段指定了引用文档所在的数据库。它是一个可选字段,如果没有指定,则默认引用当前数据库。

数据库引用($ref、$id、$db)是MongoDB中的基本功能,从早期版本开始就被支持。具体支持版本如下:

  • MongoDB 2.2版本及更高版本始终支持数据库引用。
  • 从MongoDB 3.2版本开始,$ref、$id、$db这些字段被弃用,并使用了新的$lookup操作符来实现关联查询功能。$lookup操作符更强大且更灵活,可以实现更复杂的关联查询功能。
  • 在MongoDB 4.0版本及更高版本中,可以使用$lookup stage的子阶段(lookup pipeline)来更精细地控制关联查询的行为。这使得关联查询更加灵活和强大。

所以,如果使用较新版本的MongoDB(3.2及更高版本),建议使用$lookup操作符或其子阶段来实现关联查询,而不是直接使用数据库引用。数据库引用仍然被支持,但已经不被推荐使用。

数据库引用是MongoDB中一种用于在不同集合之间建立关系的方法。它类似于关系型数据库中的外键,允许在集合之间进行引用和连接操作。在数据库引用中,我们可以通过$ref和$id字段指定对其他集合中的文档的引用。

下面是一个示例,展示了数据库引用的使用:

{"_id": ObjectId("5fd3ee95abf2581536a3456c"),"name": "John Smith","address": {"$ref": "addresses","$id": ObjectId("5fd3ee95abf2581536a3456d"),"$db": "mydb"}
}

在上面的示例中,我们有一个名为addresses的集合,其中有一个名为John Smith的文档。该文档引用了另一个集合中的地址文档。通过 r e f 字段指定了引用的集合名称, ref字段指定了引用的集合名称, ref字段指定了引用的集合名称,id字段指定了引用文档的主键值,$db字段指定了引用文档所在的数据库。

使用数据库引用,我们可以轻松地在集合之间建立关系,并通过查询操作实现引用文档的检索和连接。然而,需要注意的是,数据库引用并不是强制性的关系,不会自动处理引用的一致性和完整性。因此,在使用数据库引用时需要谨慎处理,以确保数据的一致性和完整性。

数据库引用可以用来解决数据模型中的一对多关系。例如,在一个图书管理系统中,可以将作者和图书分别存储在不同的集合中。通过在图书文档中添加一个作者引用字段,可以将每本图书与对应的作者关联起来。这样,当需要获取特定作者的所有图书时,可以通过引用字段快速查询。下面是一个示例:

  1. 创建authors集合,并插入作者文档:
db.authors.insertOne({"_id": ObjectId("5fd42e24abf2581536a3456c"),"name": "John Smith"
})
  1. 创建books集合,并插入图书文档,并在图书文档中添加一个作者引用字段:
db.books.insertOne({"_id": ObjectId("5fd42e24abf2581536a3456d"),"title": "MongoDB Tutorial","author": {"$ref": "authors","$id": ObjectId("5fd42e24abf2581536a3456c"),"$db": "mydb"}
})

在上面的示例中,我们首先在authors集合中插入了一个作者文档,其中作者的名字为John Smith。

然后,在books集合中插入了一本图书文档,其中图书的标题为MongoDB Tutorial。通过在图书文档中添加一个作者引用字段,我们将该图书与作者John Smith关联起来。在引用字段中, r e f 字段指定了引用的集合名称为 a u t h o r s , ref字段指定了引用的集合名称为authors, ref字段指定了引用的集合名称为authorsid字段指定了引用文档的主键值为5fd42e24abf2581536a3456c,$db字段可以省略,如果省略则默认引用当前数据库。

现在,我们可以使用查询操作来检索图书和其对应的作者信息。例如,我们可以使用聚合操作来连接books集合和authors集合,获取图书及其作者的信息:

db.books.aggregate([{$lookup: {from: "authors",localField: "author.$id",foreignField: "_id",as: "author"}}
])

通过上述聚合操作,我们可以获取包含图书及其对应作者信息的结果。

通过使用数据库引用,我们可以方便地在不同集合之间建立关联,并进行相关的查询和连接操作。这对于图书管理系统等需要处理关联数据的应用场景非常有用。

数据库引用还可以用于实现数据聚合和查询操作。通过引用字段,可以在多个集合之间进行联合查询,并按需获取相关数据。这种引用方式可以提高查询性能和灵活性。

然而,数据库引用并不是MongoDB的唯一关联方式。MongoDB还支持嵌入式文档和数组,这两种方式也可以实现数据间的关联。选择合适的关联方式取决于具体的数据模型和查询需求。

数据库引用是MongoDB中一种用于关联不同集合的特殊数据类型。它可以提供灵活的关系模型,并支持强大的数据查询和聚合操作。

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

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

相关文章

利用gradio快速搭建AI应用

引言 Gradio 是一个用于快速创建交互式界面的Python库,这些界面可以用于演示和测试机器学习模型。使用Gradio,开发者可以非常轻松地为他们的模型构建一个前端界面,而不需要任何Web开发经验。 与类似产品的对比 TensorBoard:主…

【Python从入门到进阶】44、Scrapy的基本介绍和安装

接上篇《43.验证码识别工具结合requests的使用》 上一篇我们学习了如何使用验证码识别工具进行登录验证的自动识别。本篇我们开启一个新的章节,来学习一下快速、高层次的屏幕抓取和web抓取框架Scrapy。 一、Scrapy框架的背景和特点 Scrapy框架是一个为了爬取网站数…

C++内存布局

温故而知新,本文浅聊和回顾下C内存布局的知识。 一、c内存布局 C的内存布局主要包括以下几个部分: 代码段:存储程序的机器代码。.数据段:存储全局变量和静态变量。数据段又分为初始化数据段(存储初始化的全局变量和…

python与机器学习2,激活函数

目录 1 什么是激活函数? activation function 1.1 阈值 1.2 激活函数a(x) ,包含偏置值θ 1.3 激活函数a(x) ,包含偏置值b 2 激活函数1: 单位阶跃函数 2.1 函数形式 2.2 函数图形 2.3 函数特点 2.4 代码实现这个 单位阶跃函数 3 激活…

Convolutional Neural Network(CNN)——卷积神经网络

1.NN的局限性 拓展性差 NN的计算量大性能差,不利于在不同规模的数据集上有效运行若输入维度发生变化,需要修改并重新训练网络容易过拟合 全连接导致参数量特别多,容易过拟合如果增加更多层,参数量会翻倍无法有效利用局部特征 输入…

结构型设计模式(三)享元模式 代理模式 桥接模式

享元模式 Flyweight 1、什么是享元模式 享元模式的核心思想是共享对象,即通过尽可能多地共享相似对象来减少内存占用或计算开销。这意味着相同或相似的对象在内存中只存在一个共享实例。 2、为什么使用享元模式 减少内存使用:通过共享相似对象&#…

汽车UDS诊断——SecureDataTransmission 加密数据传输(0x84)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍诊断和通讯管理功能单元下的84服务SecureDataTransmission,在常规诊断通信中,数据极易被第三方获取,所以在一些特殊的数据传输时,标准定义了加密数据传输的服务。 简而言之,就是在发送诊断数据时,发送方先把数…

fragstats:景观指数的时间序列分析框架

作者:CSDN _养乐多_ 本文将介绍景观指数的时间序列分析计算的软件使用方法和 python 代码,该框架可用于分析景观指数时间序列图像的趋势分析、突变分析、机器学习(分类/聚类/回归)、相关性分析、周期分析等方面。 文章目录 一、…

智能优化算法应用:基于人工电场算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于人工电场算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工电场算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工电场算法4.实验参数设定5.算法结果6.…

04-Revision和流量管理

1 Revision 关于Revision 应用程序代码及相关容器配置某个版本的不可变快照KService上的spec.template的每次变动,都会自动生成一个新的Revision通常不需要手动创建及维护 Revision的使用场景 将流量切分至不同版本的应用程序间(Canary Deployment、Blu…

静态路由及动态路由

文章目录 静态路由及动态路由一、静态路由基础1. 静态路由配置2. 负载分担3. 路由备份4. 缺省路由5. 静态路由实操 二、RIP 动态路由协议1. RIP 协议概述2. RIP 协议版本对比2.1 有类路由及无类路由 3. RIP 路由协议原理4. RIP 计时器5. 度量值6. 收敛7. 示例 静态路由及动态路…

Kafka基本原理及使用

目录 基本概念 单机版 环境准备 基本命令使用 集群版 消息模型 成员组成 1. Topic(主题): 2. Partition(分区): 3. Producer(生产者): 4. Consumer(…

使用TensorRT对Yolov5进行部署【基于Python】

如果还未配置TensorRT,请看这篇博文:Win11下TensorRT环境部署 这里使用TensorRT对Yolov5进行部署流程比较固定:先将pt模型转换为onnx,再将onnx模型转为engine,所以在执行export.py时要将onnx、engine给到include。 P…

Linear Regression线性回归(一元、多元)

目录 介绍: 一、一元线性回归 1.1数据处理 1.2建模 二、多元线性回归 2.1数据处理 2.2数据分为训练集和测试集 2.3建模 介绍: 线性回归是一种用于预测数值输出的统计分析方法。它通过建立自变量(也称为特征变量)和因变…

【Redis】五、Redis持久化、RDB和AOF

文章目录 Redis持久化一、RDB(Redis DataBase)触发机制如何恢复rdb文件 二、AOF(Append Only File)三、扩展 Redis持久化 面试和工作,持久化都是重点! Redis 是内存数据库,如果不将内存中的数据…

微服务实战系列之ZooKeeper(实践篇)

前言 关于ZooKeeper,博主已完整的通过庖丁解牛式的“解法”,完成了概述。我想掌握了这些基础原理和概念后,工作的问题自然迎刃而解,甚至offer也可能手到擒来,真实一举两得,美极了。 为了更有直观的体验&a…

uniapp 预览图片

preImg(index){let urls []this.images.map((item,i) > {if(indexi){urls.unshift(item.file_path)}else{urls.push(item.file_path)}})uni.previewImage({urls})}

linux之Samba服务器

环境:虚拟机CENTOS 7和 测试机相通 一、Samba服务器_光盘共享(匿名访问) 1.在虚拟机CENTOS 7安装smb服务,并在防火墙上允许samba流量通过 2. 挂载光盘 3.修改smb.conf配置文件,实现光盘匿名共享 4. 启动smb服务 5.在…

JVM基础扫盲

什么是JVM JVM是Java设计者用于屏蔽多平台差异,基于操作系统之上的一个"小型虚拟机",正是因为JVM的存在,使得Java应用程序运行时不需要关注底层操作系统的差异。使得Java程序编译只需编译一次,在任何操作系统都可以以相…

英码科技受邀参加2023计算产业生态大会,分享智慧轨道交通创新解决方案

12月13-14日,“凝心聚力,共赢计算新时代”——2023计算产业生态大会在北京香格里拉饭店成功举办。英码科技受邀参加行业数字化分论坛活动,市场总监李甘来先生现场发表了题为《AI哨兵,为铁路安全运营站好第一道岗》的精彩主题演讲&…