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"
}
}
文档特点
- 键值对:文档由字段和值组成
- 有序:字段顺序是有意义的
- 唯一
_id:每个文档都有一个唯一的_id字段 - 灵活模式:同一集合中的文档可以有不同的字段
_id 字段
_id 是每个文档的默认主键,具有以下特点:
- 自动创建,如果未指定则使用 ObjectId
- 唯一标识集合中的每个文档
- 不可更改
// 手动指定 _id
db.users.insertOne({ _id: 1, name: "张三" })
// 自动生成 ObjectId
db.users.insertOne({ name: "李四" })
BSON 数据类型
MongoDB 使用 BSON(Binary JSON)存储数据,它支持比 JSON 更多的数据类型。
常用数据类型
| 类型 | 示例 | 说明 |
|---|---|---|
| Double | 3.14 | 双精度浮点数 |
| String | "hello" | 字符串 |
| Object | { a: 1 } | 内嵌文档 |
| Array | [1, 2, 3] | 数组 |
| ObjectId | ObjectId("...") | 文档 ID |
| Boolean | true / false | 布尔值 |
| Date | ISODate("...") | 日期时间 |
| Null | null | 空值 |
| Integer | 42 | 整数 |
| Long | NumberLong("...") | 长整数 |
| Decimal | Decimal128("...") | 高精度小数 |
数据类型示例
// 各种数据类型的文档
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()
小结
本章我们学习了:
- 数据库:MongoDB 实例中的数据容器
- 集合:存储文档的容器,类似于表
- 文档:基本数据单元,使用 BSON 格式
- BSON 数据类型:支持多种数据类型
- 灵活模式:文档结构可以灵活变化
- 数据建模:嵌入 vs 引用的选择
这些概念是理解和使用 MongoDB 的基础,下一章我们将学习如何进行 CRUD 操作。