MongoDB 详细介绍
MongoDB 是一个开源的 NoSQL 文档型数据库,由 C++ 语言实现,设计目标是提供高性能、高扩展性和灵活的数据存储方案。它采用 BSON(Binary JSON) 格式存储数据,支持动态模式(Schema-less),适用于处理非结构化或半结构化数据。
核心特性:
- 文档模型:数据以类似 JSON 的文档形式存储,支持嵌套结构和复杂数据类型(如数组、对象)。
- 动态模式:无需预先定义表结构,可动态添加字段。
- 水平扩展:通过分片(Sharding)实现数据分布式存储,支持海量数据和高并发。
- 高可用性:通过副本集(Replica Set)提供自动故障转移和数据冗余。
- 聚合框架:支持复杂的数据处理流水线(Pipeline)。
- 索引优化:支持多种索引类型(如单字段、复合、地理空间、全文索引)。
MongoDB vs MySQL:核心优势对比
特性 | MongoDB | MySQL |
---|---|---|
数据模型 | 文档型(BSON),动态模式,适合非结构化数据 | 关系型(表格),严格模式,适合结构化数据 |
扩展性 | 天然支持水平扩展(分片) | 垂直扩展为主,水平扩展需复杂分库分表 |
查询语言 | 基于文档的查询(JSON语法) | SQL(结构化查询语言) |
事务支持 | 4.0+ 支持多文档 ACID 事务 | 原生支持 ACID 事务 |
写入性能 | 写入性能更高(默认无事务时) | 事务性写入可能降低性能 |
灵活性 | 动态字段,快速迭代开发 | 需预先设计 Schema,修改结构需迁移 |
适用场景 | 实时分析、日志、IoT、内容管理 | 金融系统、ERP 等强事务场景 |
MongoDB 核心优势:
- 灵活的数据模型:适合快速迭代的业务需求,无需频繁修改数据库结构。
- 高性能读写:BSON 存储和内存映射机制优化了读写效率。
- 分布式架构:天然支持大数据量和高并发场景。
- 开发效率高:文档结构与编程语言对象模型直接映射(如 Go 的 struct)。
Go 语言操作 MongoDB
1. 安装驱动
使用官方 MongoDB Go Driver:
go get go.mongodb.org/mongo-driver/mongo
2. 连接数据库
package main
import (
"context"
"time"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// 连接 MongoDB
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
panic(err)
}
defer client.Disconnect(ctx)
// 选择数据库和集合
collection := client.Database("testdb").Collection("users")
}
3. 插入文档
type User struct {
Name string `bson:"name"`
Email string `bson:"email"`
Age int `bson:"age"`
}
user := User{Name: "Alice", Email: "alice@example.com", Age: 30}
insertResult, err := collection.InsertOne(ctx, user)
4. 查询文档
// 查询单个文档
var result User
err := collection.FindOne(ctx, bson.M{"name": "Alice"}).Decode(&result)
// 查询多个文档
cursor, err := collection.Find(ctx, bson.M{"age": bson.M{"$gt": 25}})
defer cursor.Close(ctx)
for cursor.Next(ctx) {
var user User
cursor.Decode(&user)
fmt.Println(user)
}
5. 更新文档
filter := bson.M{"name": "Alice"}
update := bson.M{"$set": bson.M{"age": 31}}
updateResult, err := collection.UpdateOne(ctx, filter, update)
6. 删除文档
deleteResult, err := collection.DeleteMany(ctx, bson.M{"age": bson.M{"$gt": 40}})
7. 事务支持(MongoDB 4.0+)
session, err := client.StartSession()
defer session.EndSession(ctx)
err = mongo.WithSession(ctx, session, func(sc mongo.SessionContext) error {
err := session.StartTransaction()
// 执行事务操作
if err := collection.InsertOne(sc, User{Name: "Bob"}); err != nil {
session.AbortTransaction(sc)
return err
}
return session.CommitTransaction(sc)
})
总结
- 选择 MongoDB:当需要处理非结构化数据、快速迭代开发或应对高并发大数据场景时。
- 选择 MySQL:当业务需要严格的事务一致性(如支付系统)或复杂 SQL 查询时。
- Go 语言集成:通过官方驱动可高效操作 MongoDB,代码简洁且性能优异。