MongoDB学习【二】MongoDB数据模型

MongoDB基本数据类型

1. ObjectId

{"_id": ObjectId("5f7c45a9bcdd4e00018b4567")
}

2. 字符串(String)

{"name": "John Doe","email": "john.doe@example.com"
}

3. 数值(Number)

{"age": 30,"salary": NumberDecimal("123456.78"), "orderCount": NumberInt(100)
}

4. 布尔(Boolean)

{"isStudent": true,"isActive": false
}

5. 日期(Date)

{"createdAt": ISODate("2022-01-01T00:00:00Z")
}

6. 数组(Array)

{"hobbies": ["reading", "gaming", "cooking"],"scores": [90, 95, 88]
}

7. 文档(Object)

{"address": {"city": "New York","country": "USA","zip": "10001"}
}

8. 内嵌文档(Embedded Documents)

{"personalInfo": {"firstName": "John","lastName": "Doe","contact": {"phone": "+1-555-1234567","email": "john.doe@example.com"}}
}

9. 二进制数据(Binary)

{"profileImage": BinData(0,"SGVsbG8gd29ybGQ=") // Base64编码的"Hello world"
}

10. 正则表达式(Regex)

{"searchPattern": /john/i // 不区分大小写的"john"搜索
}

11. 地理位置(Geo)

{"location": {"type": "Point","coordinates": [40.7128, -74.0060] // 纽约市的经纬度坐标}
}

请注意,上述例子中的ISODateNumberDecimalNumberIntBinData 都是根据MongoDB Shell的语法编写的,在实际的编程语言驱动程序中,你可能需要使用相应语言的数据类型或方法来表示这些数据。例如,在Node.js的Mongoose库中,你可以直接使用JavaScript的Date对象表示日期,使用mongoose.Decimal128表示高精度十进制数等。

MongoDB数据结构

MongoDB的数据结构以文档为中心,它的核心概念如下:

1. 文档(Document)

在MongoDB中,文档是最基本的数据单元,类似于关系型数据库中的“行”或“记录”。文档采用BSON(Binary JSON)格式存储,这是一种二进制形式的JSON,可以包含丰富的数据类型,如字符串、数字、日期、布尔值、数组、内嵌文档以及其他特殊的BSON类型(如ObjectId)。文档是一个键值对集合,键必须是字符串,而值可以是各种数据类型,例如:

{"_id": ObjectId("507f1f77bcf86cd799439011"),"name": "John Doe","age": 30,"address": {"street": "123 Example Street","city": "New York","state": "NY"},"hobbies": ["Reading", "Programming", "Gardening"]
}

上述文档包含了一个人的名字、年龄、地址(这是一个内嵌文档)和一系列爱好(这是一个数组)。

2. 集合(Collection)

集合在MongoDB中对应于关系型数据库中的“表”,它是文档的逻辑分组。然而,与传统的关系型数据库表相比,MongoDB的集合具有无模式(schema-less)的特性,意味着同一集合内的文档可以有不同的字段和结构。尽管如此,实践中通常会为集合内的文档保持某种模式以便更好地管理和查询数据。

例如,在一个名为users的集合中,可以存放多个用户文档:

users = [{"_id": ObjectId("507f1f77bcf86cd799439011"),"name": "John Doe","age": 30,...},{"_id": ObjectId("507f1f77bcf86cd799439012"),"name": "Jane Smith","age": 28,"address": {"street": "456 Another Street","city": "San Francisco","state": "CA"},"hobbies": ["Painting", "Skiing"]}
]

以上users集合包含两个用户文档,每个文档都有自己的独特结构,尽管它们共享一些共同的字段如nameage,但也有各自特有的字段,如第二个用户文档中包含的地址信息和不同的爱好列表。

MongoDB数据模型设计

MongoDB作为NoSQL数据库,其数据模型的核心是基于JSON-like文档的集合(Collections),每个文档可以自由地拥有动态schema,这意味着同一个集合中的文档可以有不同的字段和结构。MongoDB的数据模型设计灵活,并且支持以下几种主要的方式来组织和关联数据:

1. 嵌入式数据模型 (Embedded Data Model)

在这种模型中,一个文档可以包含其他相关的数据作为一个子文档数组或嵌套对象。例如,一个用户文档可能直接嵌套包含多个地址记录,而不是将它们放在单独的表中通过外键关联。

{"_id": ObjectId("..."),"name": "John Doe","addresses": [{ "type": "home", "street": "123 Main St" },{ "type": "work", "street": "456 Elm Ave" }]
}

2. 引用数据模型 (Referenced Data Model)

当数据不适合嵌入或者为了更好的模块化和重复利用时,可以在不同的集合之间创建引用关系。这通常通过存储指向另一个文档 _id 的引用实现。

// 用户集合
{"_id": ObjectId("user_1"),"name": "John Doe"
}// 地址集合
{"_id": ObjectId("address_1"),"userId": ObjectId("user_1"),"type": "home","street": "123 Main St"
}

3. 组合使用嵌入和引用

根据实际业务场景,有时会结合使用嵌入和引用,即部分常用或小粒度的数据嵌入在主文档内,而大粒度或频繁更新的数据则通过引用的方式存放在其他集合中。

4. 规范化的数据模型

尽管MongoDB鼓励对数据进行反规范化以便提高读取效率,但也可以按照类似关系数据库的设计原则进行一定程度的规范化,特别是在有复杂事务处理需求的情况下。

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

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

相关文章

Java的Future机制详解

Java的Future机制详解 一、为什么出现Future机制二、Future的相关类图2.1 Future 接口2.2 FutureTask 类 三、FutureTask的使用方法四、FutureTask源码分析4.1 state字段4.2 其他变量4.4 构造函数4.5 run方法及其他 一、为什么出现Future机制 常见的两种创建线程的方式。一种是…

Python进阶编程 --- 2.MySQL、pymysql、PySpark

文章目录 第一章:SQL基础入门1.1 数据库数据库如何存储数据 1.2 数据库和SQL的关系1.3 MySQL版本1.4 命令提示符内使用MySQL1.5 SQL概述1.5.1 SQL语言分类1.5.2 SQL语言特性 1.6 DDL库管理表管理 1.7 DML - 数据操作1.8 DQL - 查询和计算数据1.8.1 基础数据查询1.8.…

HDFS Lease详解

本文主要介绍hdfs lease的设计以及实现。 写在前面 https://www.cnblogs.com/jhcelue/p/6783076.html https://blog.csdn.net/yexiguafu/article/details/118890014 https://www.jianshu.com/p/33e1a5a2b876 https://blog.csdn.net/breakout_alex/article/details/1014569…

行业模板|DataEase批发零售大屏模板推荐

DataEase开源数据可视化分析平台于2022年6月发布模板市场(https://templates-de.fit2cloud.com),并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板,方便用户根据…

LeetCode-热题100:75. 颜色分类

题目描述 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数的…

【Canvas与艺术】绘制斜置黄色三角biohazard标志

【关键点】 径向渐变色和文字按角度偏转。 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使用Html5/Canvas绘制…

spring-cloud微服务gateway

核心部分&#xff1a;routes(路由)&#xff0c; predicates(断言)&#xff0c;filters(过滤器) id&#xff1a;可以理解为是这组配置的一个id值&#xff0c;请保证他的唯一的&#xff0c;可以设置为和服务名一致 uri&#xff1a;可以理解为是通过条件匹配之后需要路由到&…

2024 CKA 基础操作教程(十二)

题目内容 考点相关内容分析 Pods Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。 Pod 是 Kubernetes 中的原子单元&#xff0c;用于封装应用程序的一个或多个容器、存储资源、唯一的网络 IP&#xff0c;以及有关如何运行容器的选项。Pod 提供了一个共享的…

一些实用的工具网站

200 css渐变底色 https://webgradients.com/ 200动画效果复制 https://css-loaders.com/classic/ 二次贝塞尔曲线 https://blogs.sitepointstatic.com/examples/tech/canvas-curves/bezier-curve.html 三次贝塞尔曲线 https://blogs.sitepointstatic.com/examples/tech/c…

Day92:系统攻防-WindowsLinux远程探针本地自检任意执行权限提升入口点

目录 操作系统-远程漏扫-Nessus&Nexpose&Goby Nessus Nexpose 知识点&#xff1a; 1、远程漏扫-Nessus&Nexpose&Goby 2、本地漏扫-Wesng&Tiquan&Suggester 3、利用场景-远程利用&本地利用&利用条件 操作系统-远程漏扫-Nessus&Nexpose&a…

Python——详细解析目标检测xml格式标注转换为txt格式

本文简述了目标检测xml格式标注的内容&#xff0c;以及yolo系列模型所需的txt格式标注的内容。并提供了一个简单的&#xff0c;可以将xml格式标注文件转换为txt格式标注文件的python脚本。 1. xml格式文件内容 <size>标签下为图片信息&#xff0c;包括 <width> …

​​​​​​​iOS配置隐私清单文件App Privacy Configuration

推送到TestFlight后邮件收到警告信息如下&#xff0c;主要关于新的隐私政策需要补充&#xff1a; Hello, We noticed one or more issues with a recent submission for TestFlight review for the following app: AABBCC Version 10.10.10 Build 10 Although submission for …

servlet的三个重要的类(httpServlet 、httpServletRequst、 httpServletResponse)

一、httpServlet 写一个servlet代码一般都是要继承httpServlet 这个类&#xff0c;然后重写里面的方法 但是它有一个特点&#xff0c;根据之前写的代码&#xff0c;我们发现好像没有写main方法也能正常执行。 原因是&#xff1a;这个代码不是直接运行的&#xff0c;而是放到…

共模电感饱和电流和额定电流的区别

共模电感饱和电流和额定电流是两个不同的概念&#xff0c;它们的区别如下&#xff1a; 1. 定义不同&#xff1a;共模电感饱和电流是指当通过共模电感的电流超过一定值时&#xff0c;共模电感的磁芯开始饱和&#xff0c;导致电感值下降。额定电流是指共模电感在正常工作条件下…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《应用图论建模输电网的电力现货市场出清模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

JavaSE图书管理系统实战

代码仓库地址&#xff1a;Java图书管理系统 1.前言 该项目将JavaSE的封装继承多态三大特性&#xff0c;使用了大量面向对象的操作&#xff0c;有利于巩固理解 &#xff08;1&#xff09;实现效果 2.实现步骤 第一步先把框架搭建起来&#xff0c;即创建出人&#xff1a;管理员和…

RocketMQ 02 功能大纲介绍

RocketMQ 02 主流的MQ有很多&#xff0c;比如ActiveMQ、RabbitMQ、RocketMQ、Kafka、ZeroMQ等。 之前阿里巴巴也是使用ActiveMQ&#xff0c;随着业务发展&#xff0c;ActiveMQ IO 模块出现瓶颈&#xff0c;后来阿里巴巴 通过一系列优化但是还是不能很好的解决&#xff0c;之后…

串口通信有哪些常见的应用领域?

串口通信是一种常见的数据通信方式&#xff0c;它使用串行接口在两个设备之间发送和接收数据。这种通信方式由于其简单性和广泛的支持&#xff0c;在多个应用领域中被广泛使用。下面是一些串口通信的常见应用领域&#xff1a; 工业自动化&#xff1a;串口通信在工业自动化中非常…

MySQL底层架构

MySQL底层架构 连接器 验证客户端连接的用户名密码、校验权限、维持和管理连接。 客户端如果超过 wailt_timeout 没有动静&#xff0c;连接器会主动将它断开&#xff0c;此时客户端再次发送请求的话&#xff0c;就会收到错误&#xff1a;lost connection to MySQL server dur…

【Modelsim】保持波形格式重编译and波形的保存与查看

文章目录 保持原波形格式重编译波形的保持与查看保存波形打开工程查看波形 保持原波形格式重编译 Modelsim 仿真设置好波形格式后&#xff0c;若需要修改代码并保持原波形格式重新查看波形&#xff0c;只需将文件重新编译后仿真即可。 1.修改代码后Project页面的代码状态变成…