跳到主要内容

MongoDB 核心概念

本章将介绍 MongoDB 的核心概念:数据库、集合、文档和 BSON 数据类型。

数据库(Database)

数据库是 MongoDB 中最高级别的数据容器,一个 MongoDB 实例可以包含多个数据库。

数据库命名规则

// 切换到指定数据库(如果不存在则创建)
use mydb

// 查看当前数据库
db

// 查看所有数据库
show dbs

命名规范

  • 必须以字母或下划线开头
  • 不能包含空格、特殊字符(/、\、"、$ 等)
  • 建议使用小写字母
  • 最大长度为 64 字节

系统数据库

MongoDB 预设了几个系统数据库:

数据库名说明
admin系统管理员数据库,包含用户和角色信息
local本地数据库,用于存储副本集配置等
config分片集群配置信息
test默认测试数据库

集合(Collection)

集合是存储文档的容器,类似于关系型数据库中的表。

创建集合

// 显式创建集合
db.createCollection("users")

// 隐式创建(插入文档时自动创建)
db.products.insertOne({ name: "iPhone", price: 999 })

集合命名规则

  • 不能以 "system." 开头(系统集合保留前缀)
  • 不能包含 "$" 字符
  • 不能以 "." 开头(在某些版本中有限制)

查看集合

// 查看当前数据库的所有集合
show collections

// 查看集合中的文档数量
db.users.countDocuments()

删除集合

db.users.drop()

文档(Document)

文档是 MongoDB 中的基本数据单元,存储为 BSON 格式(Binary JSON)。

文档结构

{
"_id": ObjectId("507f1f77bcf86cd799439011"),
"username": "zhangsan",
"email": "[email protected]",
"age": 28,
"isActive": true,
"createdAt": ISODate("2024-01-15T10:30:00Z"),
"tags": ["developer", "writer"],
"profile": {
"city": "Beijing",
"bio": "Software engineer"
}
}

文档特点

  1. 键值对:文档由字段和值组成
  2. 有序:字段顺序是有意义的
  3. 唯一 _id:每个文档都有一个唯一的 _id 字段
  4. 灵活模式:同一集合中的文档可以有不同的字段

_id 字段

_id 是每个文档的默认主键,具有以下特点:

  • 自动创建,如果未指定则使用 ObjectId
  • 唯一标识集合中的每个文档
  • 不可更改
// 手动指定 _id
db.users.insertOne({ _id: 1, name: "张三" })

// 自动生成 ObjectId
db.users.insertOne({ name: "李四" })

BSON 数据类型

MongoDB 使用 BSON(Binary JSON)存储数据,它支持比 JSON 更多的数据类型。

常用数据类型

类型示例说明
Double3.14双精度浮点数
String"hello"字符串
Object{ a: 1 }内嵌文档
Array[1, 2, 3]数组
ObjectIdObjectId("...")文档 ID
Booleantrue / false布尔值
DateISODate("...")日期时间
Nullnull空值
Integer42整数
LongNumberLong("...")长整数
DecimalDecimal128("...")高精度小数

数据类型示例

// 各种数据类型的文档
db.test.insertOne({
string: "Hello World",
number: 42,
float: 3.14159,
boolean: true,
date: new Date(),
null: null,
array: [1, 2, 3],
object: { key: "value" },
objectId: ObjectId(),
long: NumberLong("123456789"),
decimal: NumberDecimal("99.99")
})

// 查看数据类型
db.test.findOne()

灵活模式(Flexible Schema)

MongoDB 的集合不强制要求统一的文档结构,这提供了很大的灵活性。

示例:同一集合中的不同文档

// 文档 A
{ name: "Alice", age: 25 }

// 文档 B(不同的字段)
{ name: "Bob", email: "[email protected]" }

// 文档 C(额外的嵌套结构)
{
name: "Charlie",
address: {
city: "Shanghai",
country: "China"
}
}

使用场景

灵活模式适用于:

  • 快速原型开发
  • 业务需求频繁变化
  • 文档结构差异大的场景

模式验证(Schema Validation)

MongoDB 4.0+ 支持模式验证,可以限制集合中的文档结构:

db.createCollection("products", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "price"],
properties: {
name: {
bsonType: "string",
description: "产品名称,必填"
},
price: {
bsonType: "number",
minimum: 0,
description: "价格,必须大于等于 0"
},
category: {
bsonType: "string",
enum: ["electronics", "clothing", "food"]
}
}
}
}
})

MongoDB 数据模型设计

嵌入 vs 引用

MongoDB 提供了两种方式来处理关联数据:

1. 嵌入(Embedding)

将相关数据存储在同一个文档中:

{
"_id": 1,
"name": "Order 001",
"customer": {
"name": "张三",
"email": "[email protected]"
},
"items": [
{ "product": "iPhone", "qty": 1 },
{ "product": "AirPods", "qty": 2 }
]
}

适用场景

  • 数据经常一起查询
  • 是一对或一对少的关系
  • 不需要频繁更新嵌入的数据

2. 引用(Reference)

通过 ID 引用其他集合的文档:

// orders 集合
{
"_id": 1,
"customerId": 101,
"items": [...]
}

// customers 集合
{
"_id": 101,
"name": "张三",
"email": "[email protected]"
}

适用场景

  • 数据需要单独管理
  • 是一对多的关系
  • 需要频繁更新关联数据
  • 需要跨集合共享数据

选择建议

实战示例

创建完整的数据库结构

// 1. 创建数据库
use myapp

// 2. 创建用户集合(带验证规则)
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["username", "email", "createdAt"],
properties: {
username: {
bsonType: "string",
minLength: 3,
maxLength: 20
},
email: {
bsonType: "string",
pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
},
age: {
bsonType: "int",
minimum: 0,
maximum: 150
},
createdAt: {
bsonType: "date"
}
}
}
}
})

// 3. 插入示例文档
db.users.insertMany([
{
username: "zhangsan",
email: "[email protected]",
age: 28,
createdAt: new Date("2024-01-15"),
tags: ["developer", "admin"]
},
{
username: "lisi",
email: "[email protected]",
age: 32,
createdAt: new Date("2024-02-01"),
profile: {
city: "Shanghai",
bio: "Full stack developer"
}
}
])

// 4. 查询验证
db.users.find()

小结

本章我们学习了:

  1. 数据库:MongoDB 实例中的数据容器
  2. 集合:存储文档的容器,类似于表
  3. 文档:基本数据单元,使用 BSON 格式
  4. BSON 数据类型:支持多种数据类型
  5. 灵活模式:文档结构可以灵活变化
  6. 数据建模:嵌入 vs 引用的选择

这些概念是理解和使用 MongoDB 的基础,下一章我们将学习如何进行 CRUD 操作。