MongoDB的知识点梳理,内容有chatgpt4.1辅助完成,使用的提示词(文章大致内容)如下,可按需“食用”😊:
mongodb 定义
关键概念
如何增删改查
如何持久化
如何用go语言操作他
是否支持事务,如果是实现原理,他相对于mysql他存储数据的底层逻辑是?
1. MongoDB 定义
MongoDB 是一个开源的、面向文档的 NoSQL 数据库,以高性能、高可用、易扩展著称。它用 BSON(一种类 JSON 的二进制格式)存储数据,适合存储结构灵活、变化频繁的数据。
2. 关键概念
- 数据库(Database):MongoDB 可以有多个数据库,类似 MySQL 的库。
- 集合(Collection):类似 MySQL 的表,但不需要预定义结构(schema-less)。
- 文档(Document):集合中的一条数据,类似 MySQL 的一行,但是 JSON/BSON 格式,可以嵌套和灵活扩展。
- 字段(Field):文档中的 key-value 对,类似表的列。
- 主键(_id):每个文档都有唯一的
_id
字段,类似 MySQL 的主键。 - 索引(Index):加速查询。
- 副本集(Replica Set):实现高可用的主从复制机制。
- 分片(Sharding):实现大数据量的分布式存储和负载均衡。
3. 如何增删改查(CRUD)
以 MongoDB Shell 为例:
插入(Insert)
db.collection.insertOne({name: "Tom", age: 18}) db.collection.insertMany([{name: "Jerry"}, {name: "Spike"}])
查询(Find)
db.collection.find({name: "Tom"}) db.collection.findOne({_id: ObjectId("...")})
更新(Update)
db.collection.updateOne({name: "Tom"}, {$set: {age: 20}}) db.collection.updateMany({age: {$lt: 18}}, {$set: {status: "minor"}})
删除(Delete)
db.collection.deleteOne({name: "Tom"}) db.collection.deleteMany({status: "minor"})
4. 如何持久化
MongoDB 默认将数据持久化到磁盘,数据文件存储在 dbPath
目录(如 /data/db
)。
- 写入时先写到内存(WiredTiger 缓存),然后定期(或通过
fsync
)刷到磁盘。 - 支持预写日志(WiredTiger Journal),保证崩溃恢复。
- 副本集机制可实现多节点冗余备份。
5. 如何用 Go 语言操作 MongoDB
使用官方驱动 go.mongodb.org/mongo-driver:
安装:
go get go.mongodb.org/mongo-driver/mongo
基本用法:
import (
"context"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/bson"
"time"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil { panic(err) }
collection := client.Database("testdb").Collection("users")
// 插入
res, err := collection.InsertOne(ctx, bson.M{"name": "Tom", "age": 18})
// 查询
var result bson.M
err = collection.FindOne(ctx, bson.M{"name": "Tom"}).Decode(&result)
// 更新
_, err = collection.UpdateOne(ctx, bson.M{"name": "Tom"}, bson.M{"$set": bson.M{"age": 20}})
// 删除
_, err = collection.DeleteOne(ctx, bson.M{"name": "Tom"})
}
6. 是否支持事务?实现原理?
支持事务
- MongoDB 4.0+ 开始支持多文档事务(类似 MySQL 的事务),但仅限于副本集,4.2+ 支持分片集群事务。
- 事务保证原子性、一致性、隔离性、持久性(ACID)。
实现原理
- 事务期间,所有操作先写入事务日志,只有 commit 后才真正写入数据文件。
- 采用两阶段提交协议(2PC),保证分布式一致性。
- 事务期间,相关文档会加锁,防止并发写入冲突。
Go 事务用法示例
sess, err := client.StartSession()
defer sess.EndSession(ctx)
result, err := sess.WithTransaction(ctx, func(sc mongo.SessionContext) (interface{}, error) {
collection.InsertOne(sc, bson.M{"name": "A"})
collection.InsertOne(sc, bson.M{"name": "B"})
return nil, nil
})
7. MongoDB vs MySQL 存储底层逻辑
MongoDB
- 面向文档:每条数据是 BSON 文档,结构灵活,可以嵌套。
- 无固定表结构:同一集合的文档可以有不同字段。
- WiredTiger 存储引擎(默认):B+树索引,数据以块为单位存储,支持压缩。
- 预写日志(Journal):保证崩溃恢复。
- 副本集/分片:天然支持分布式和高可用。
MySQL
- 面向行的关系型数据库:表结构固定,数据按行存储。
- InnoDB 存储引擎(默认):B+树索引,数据页存储,支持事务、行级锁。
- 表结构严格:每行数据字段必须一致。
- 支持外键、JOIN:适合复杂关系建模。
- 分布式需依赖外部方案(如 MyCat、ShardingSphere)。
总结对比
特性 | MongoDB | MySQL |
---|---|---|
数据模型 | 文档(BSON/JSON) | 行(表结构) |
结构 | 灵活、无 schema | 严格 schema |
存储引擎 | WiredTiger(B+树+压缩) | InnoDB(B+树) |
事务 | 4.0+ 支持多文档事务 | 天生支持事务 |
分布式 | 原生副本集、分片 | 需外部中间件 |
适用场景 | 大数据量、灵活结构、快速开发 | 结构化数据、强一致性、复杂查询 |
8. 总结
- MongoDB 是面向文档的 NoSQL 数据库,灵活、易扩展,支持事务和分布式。
- Go 语言可用官方驱动操作 MongoDB,支持 CRUD 和事务。
- MongoDB 底层以 BSON 文档存储,结构灵活,和 MySQL 的行式存储、严格表结构有本质区别。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。