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)。

总结对比

特性MongoDBMySQL
数据模型文档(BSON/JSON)行(表结构)
结构灵活、无 schema严格 schema
存储引擎WiredTiger(B+树+压缩)InnoDB(B+树)
事务4.0+ 支持多文档事务天生支持事务
分布式原生副本集、分片需外部中间件
适用场景大数据量、灵活结构、快速开发结构化数据、强一致性、复杂查询

8. 总结

  • MongoDB 是面向文档的 NoSQL 数据库,灵活、易扩展,支持事务和分布式。
  • Go 语言可用官方驱动操作 MongoDB,支持 CRUD 和事务。
  • MongoDB 底层以 BSON 文档存储,结构灵活,和 MySQL 的行式存储、严格表结构有本质区别。

自由自在像小鸟
4 声望1 粉丝