MongoDB

MongoDB 详细介绍

MongoDB 是一个开源的 NoSQL 文档型数据库,由 C++ 语言实现,设计目标是提供高性能、高扩展性和灵活的数据存储方案。它采用 BSON(Binary JSON) 格式存储数据,支持动态模式(Schema-less),适用于处理非结构化或半结构化数据。

核心特性:
  1. 文档模型:数据以类似 JSON 的文档形式存储,支持嵌套结构和复杂数据类型(如数组、对象)。
  2. 动态模式:无需预先定义表结构,可动态添加字段。
  3. 水平扩展:通过分片(Sharding)实现数据分布式存储,支持海量数据和高并发。
  4. 高可用性:通过副本集(Replica Set)提供自动故障转移和数据冗余。
  5. 聚合框架:支持复杂的数据处理流水线(Pipeline)。
  6. 索引优化:支持多种索引类型(如单字段、复合、地理空间、全文索引)。

MongoDB vs MySQL:核心优势对比

特性 MongoDB MySQL
数据模型 文档型(BSON),动态模式,适合非结构化数据 关系型(表格),严格模式,适合结构化数据
扩展性 天然支持水平扩展(分片) 垂直扩展为主,水平扩展需复杂分库分表
查询语言 基于文档的查询(JSON语法) SQL(结构化查询语言)
事务支持 4.0+ 支持多文档 ACID 事务 原生支持 ACID 事务
写入性能 写入性能更高(默认无事务时) 事务性写入可能降低性能
灵活性 动态字段,快速迭代开发 需预先设计 Schema,修改结构需迁移
适用场景 实时分析、日志、IoT、内容管理 金融系统、ERP 等强事务场景
MongoDB 核心优势
  1. 灵活的数据模型:适合快速迭代的业务需求,无需频繁修改数据库结构。
  2. 高性能读写:BSON 存储和内存映射机制优化了读写效率。
  3. 分布式架构:天然支持大数据量和高并发场景。
  4. 开发效率高:文档结构与编程语言对象模型直接映射(如 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: "[email protected]", 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,代码简洁且性能优异。

你可能感兴趣的:(mongodb,数据库)