MongoDB学习【二】MongoDB数据模型

MongoDB基本数据类型

1. ObjectId

json 复制代码
{
  "_id": ObjectId("5f7c45a9bcdd4e00018b4567")
}

2. 字符串(String)

json 复制代码
{
  "name": "John Doe",
  "email": "john.doe@example.com"
}

3. 数值(Number)

json 复制代码
{
  "age": 30,
  "salary": NumberDecimal("123456.78"), 
  "orderCount": NumberInt(100)
}

4. 布尔(Boolean)

json 复制代码
{
  "isStudent": true,
  "isActive": false
}

5. 日期(Date)

json 复制代码
{
  "createdAt": ISODate("2022-01-01T00:00:00Z")
}

6. 数组(Array)

json 复制代码
{
  "hobbies": ["reading", "gaming", "cooking"],
  "scores": [90, 95, 88]
}

7. 文档(Object)

json 复制代码
{
  "address": {
    "city": "New York",
    "country": "USA",
    "zip": "10001"
  }
}

8. 内嵌文档(Embedded Documents)

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

9. 二进制数据(Binary)

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

10. 正则表达式(Regex)

json 复制代码
{
  "searchPattern": /john/i // 不区分大小写的"john"搜索
}

11. 地理位置(Geo)

json 复制代码
{
  "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)。文档是一个键值对集合,键必须是字符串,而值可以是各种数据类型,例如:

json 复制代码
{
  "_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的集合中,可以存放多个用户文档:

json 复制代码
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)

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

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

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

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

json 复制代码
// 用户集合
{
  "_id": ObjectId("user_1"),
  "name": "John Doe"
}

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

3. 组合使用嵌入和引用

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

4. 规范化的数据模型

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

相关推荐
学编程的小程7 分钟前
突破局域网限制:MongoDB远程管理新体验
数据库·mongodb
波波烤鸭15 分钟前
Redis 高可用实战源码解析(Sentinel + Cluster 整合应用)
数据库·redis·sentinel
l1t4 小时前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
Hello_Embed7 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中7 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Magnetic_h8 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
MarkHard1238 小时前
如何利用redis使用一个滑动窗口限流
数据库·redis·缓存
研梦非凡9 小时前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
清风66666610 小时前
基于STM32的APP遥控视频水泵小车设计
stm32·单片机·mongodb·毕业设计·音视频·课程设计
limengshi13839210 小时前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习