MongoDB 是一种面向文档的 NoSQL 数据库,以高性能、灵活性和扩展性著称。它与传统的关系型数据库(如 MySQL)不同,使用的是非结构化的数据存储方式,非常适合需要快速开发和处理海量数据的场景。
核心概念:
-
文档 (Document):MongoDB 中的记录,类似 JSON 格式。
-
集合 (Collection):存储文档的容器,相当于关系型数据库的表。
-
数据库 (Database):存储多个集合的容器。
-
BSON:MongoDB 存储数据的二进制格式,比 JSON 更高效。
-
_id:文档的唯一标识符,相当于主键。
"_id": {
"$oid": "6561475ce1013330d1e3f2db"
}
ObjectId 是一个12字节 BSON 类型数据,通常以24个十六进制数字的形式表示,有以下格式:
-
前4个字节表示时间戳
-
接下来的3个字节是机器标识码
-
紧接的2个字节由进程id组成(PID)
-
最后3个字节是随机数。
MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型的,默认是个ObjectId对象。
在一个集合里面,每个文档都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。
具体操作:
## 1. 数据库操作
# 切换到指定的数据库,如果数据库不存在会自动创建
use myDatabase
# 查看所有数据库
show dbs
# 删除当前所使用的数据库
db.dropDatabase()
## 2. 集合操作
# 查看当前数据库中的所有集合
show collections
# 创建集合
# 创建一个名为 "users" 的集合
db.createCollection("users")
# 删除集合
# 删除名为 "users" 的集合
db.users.drop()
## 3. 文档操作
### 插入文档
# 插入单个文档
db.users.insertOne({ name: "Alice", age: 25, hobbies: ["reading", "swimming"] })
# 插入多个文档
db.users.insertMany([
{ name: "Bob", age: 30, active: true },
{ name: "Charlie", age: 35, active: false }
])
### 查询文档
# 查询所有文档
db.users.find()
# 查询指定条件的文档
db.users.find({ age: { $gte: 30 } }) # 查询 age 大于等于 30 的文档
# 查询并只返回特定字段
db.users.find({ age: 30 }, { name: 1, _id: 0 }) # 返回 name 字段,隐藏 _id
# 查询单个文档
db.users.findOne({ active: true })
### 更新文档
# 更新单个文档,设置新的字段
db.users.updateOne(
{ name: "Alice" }, # 查询条件
{ $set: { city: "New York" } } # 更新内容
)
# 更新多个文档
db.users.updateMany(
{ age: { $lt: 35 } }, # 查询条件
{ $set: { status: "young" } } # 更新内容
)
# 替换整个文档
db.users.replaceOne(
{ name: "Charlie" }, # 查询条件
{ name: "Charlie", age: 36, active: true } # 新文档
)
### 删除文档
# 删除单个文档
db.users.deleteOne({ name: "Bob" })
# 删除多个文档
db.users.deleteMany({ age: { $lt: 35 } })
## 4. 索引操作
# 创建索引
# 在 name 字段上创建升序索引
db.users.createIndex({ name: 1 })
# 在多个字段上创建复合索引
db.users.createIndex({ name: 1, age: -1 })
# 查看集合的所有索引
db.users.getIndexes()
# 删除索引
db.users.dropIndex("name_1")
## 5. 聚合操作
# 聚合管道:过滤 + 分组
db.users.aggregate([
{ $match: { age: { $gte: 25 } } }, # 过滤条件
{ $group: { _id: "$status", total: { $sum: 1 } } } # 按 status 分组并统计数量
])
# 聚合管道:排序 + 限制返回数量
db.users.aggregate([
{ $sort: { age: -1 } }, # 按 age 降序排序
{ $limit: 2 } # 限制返回前 2 条记录
])