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

MongoDB教程(十一):MongoDB关系管理与文档关联

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • MongoDB中的关系管理策略
      • 一、嵌入式文档
        • 示例:用户和地址关系
      • 二、引用
        • 示例:用户和订单关系
      • 三、混合使用嵌入和引用
        • 示例:用户和地址列表关系
      • 结论

引言

在传统的关系型数据库中,实体之间的关联通过外键约束来实现。然而,在MongoDB这样的NoSQL数据库中,数据模型的构建更加灵活,允许采用不同的方式来处理关系。本文将深入探讨MongoDB中管理实体关系的几种策略,包括嵌入式文档、引用以及混合使用的方法,并通过具体案例代码展示如何在实际项目中应用这些策略。

MongoDB中的关系管理策略

MongoDB提供了三种主要的方式来处理实体之间的关系:

  1. 嵌入式文档
  2. 引用(参照其他文档的ID)
  3. 混合使用嵌入和引用

一、嵌入式文档

在嵌入式文档中,一个实体的某些属性是作为另一个实体的一部分直接存储的。这种方式适用于实体之间的关系紧密,且需要频繁一起读取的场景。

示例:用户和地址关系

假设我们有一个用户实体和一个地址实体,如果一个用户只有一个地址,并且这个地址总是与用户一起读取,那么我们可以将地址作为一个嵌入式的文档存储在用户文档中。

from pymongo import MongoClient# 连接MongoDB
client = MongoClient('mongodb://localhost:27017/')
db = client['mydatabase']# 插入一个带有嵌入式地址的用户
user = {"name": "John Doe","address": {"street": "123 Main St","city": "Anytown","state": "CA","zip": "12345"}
}
db.users.insert_one(user)# 查询用户及其地址
user_with_address = db.users.find_one({"name": "John Doe"})
print(user_with_address)

二、引用

当实体之间的关系不是那么紧密,或者一个实体可能与多个其他实体关联时,使用引用是一种更好的选择。在这种情况下,一个实体会存储另一个实体的ID,而不是直接包含其数据。

示例:用户和订单关系

假设我们有一个用户实体和一个订单实体,一个用户可以有多个订单,每个订单属于一个用户。在这种情况下,我们将订单的文档ID存储在用户文档中,或者反过来,将用户ID存储在每个订单文档中。

# 插入用户
user = {"name": "Jane Smith"}
user_id = db.users.insert_one(user).inserted_id# 插入订单并引用用户
order = {"orderNumber": 12345, "userRef": str(user_id)}
db.orders.insert_one(order)# 查询用户的所有订单
user_orders = db.orders.find({"userRef": str(user_id)})
for order in user_orders:print(order)

三、混合使用嵌入和引用

在某些情况下,可能需要结合使用嵌入和引用。例如,一个用户可能有多个地址,其中一个是默认地址,可以将其作为嵌入式文档,而其他地址则作为引用存储。

示例:用户和地址列表关系
# 插入用户和默认地址
user = {"name": "Michael Scott","defaultAddress": {"street": "409 Northpoint Dr","city": "Scranton","state": "PA","zip": "18503"}
}
user_id = db.users.insert_one(user).inserted_id# 插入其他地址并引用用户
address = {"street": "123 Dunder Mifflin St", "userRef": str(user_id)}
address_id = db.addresses.insert_one(address).inserted_id# 更新用户文档,添加地址引用
db.users.update_one({"_id": user_id}, {"$push": {"addresses": str(address_id)}})# 查询用户的所有地址
user_with_addresses = db.users.find_one({"_id": user_id})
print(user_with_addresses)

结论

MongoDB提供了多种灵活的方式来处理实体之间的关系,选择哪种策略取决于具体的应用场景和性能需求。嵌入式文档适合紧密耦合的数据,引用适合松散耦合的数据,而混合策略则适用于更复杂的情况。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【MongoDB系列】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

MongoDB相关文章索引文章链接
MongoDB教程(一):Linux系统安装mongoDB详细教程MongoDB教程(一):Linux系统安装mongoDB详细教程
MongoDB教程(二):mongoDB引用shellMongoDB教程(二):mongoDB引用shell
MongoDB教程(三):mongoDB用户管理MongoDB教程(三):mongoDB用户管理
MongoDB教程(四):mongoDB索引MongoDB教程(四):mongoDB索引
MongoDB教程(五):mongoDB聚合框架MongoDB教程(五):mongoDB聚合框架
MongoDB教程(六):mongoDB复制副本集MongoDB教程(六):mongoDB复制副本集
MongoDB教程(七):mongoDB分片MongoDB教程(七):mongoDB分片
MongoDB教程(八):mongoDB数据备份与恢复MongoDB教程(八):mongoDB数据备份与恢复
MongoDB教程(九):java集成mongoDBMongoDB教程(九):java集成mongoDB
MongoDB教程(十):Python集成mongoDBMongoDB教程(十):Python集成mongoDB

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 加密传输及相关安全验证:
  • bash 笔记
  • Web开发:xmlns解析
  • SpringBoot:SpringBoot通过注解监测Controller接口
  • 使用 Redis 实现验证码、token 的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决 token 刷新的问题
  • 用PyTorch从零开始编写DeepSeek-V2
  • React antd form表单未保存跳转页面提示
  • 【git】github中的Pull Request是什么
  • 医学深度学习与机器学习融合的随想
  • MFC列表框示例
  • watch监听vue2与vue3的写法
  • 梧桐数据库:数据库技术中表之间的连接算法详解
  • 第2章-数学建模
  • Spring Authorization Server 自定义 OAuth2 密码模式返回数据结构优化
  • AndroidStudio 编辑xml布局文件卡死问题解决
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • HomeBrew常规使用教程
  • JavaScript服务器推送技术之 WebSocket
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Linux中的硬链接与软链接
  • Protobuf3语言指南
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vue组件定义
  • 阿里云Kubernetes容器服务上体验Knative
  • 阿里云应用高可用服务公测发布
  • 闭包--闭包之tab栏切换(四)
  • 给Prometheus造假数据的方法
  • 汉诺塔算法
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 什么是Javascript函数节流?
  • 使用 QuickBI 搭建酷炫可视化分析
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #pragma pack(1)
  • #QT(QCharts绘制曲线)
  • #考研#计算机文化知识1(局域网及网络互联)
  • ()、[]、{}、(())、[[]]命令替换
  • (06)金属布线——为半导体注入生命的连接
  • (11)MSP430F5529 定时器B
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)Linq学习笔记
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net refrector
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)