MongoDB

MongoDB 详细介绍

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

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

MongoDB vs MySQL:核心优势对比

特性MongoDBMySQL
数据模型文档型(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: "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,代码简洁且性能优异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终生成长者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值