目录

MongoDB使用Golang

MongoDB(使用Golang)

什么是MongoDB

MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写。它是一个 NoSQL 数据库,旨在为现代应用提供高性能、高可用性和可扩展性。

特点

  • 文档存储 :MongoDB 使用 BSON(类似 JSON 的二进制格式)存储数据。
  • 灵活的模式 :无需预定义数据结构,支持动态模式。
  • 高性能 :支持索引、复制和分片,提供高效的数据访问和存储。
  • 高可用性 :通过复制集实现数据的高可用性和自动故障恢复。
  • 可扩展性 :支持水平扩展,通过分片技术处理大规模数据。

使用场景

  • 大数据应用 :适用于需要处理大量数据的应用,如日志分析、实时数据处理等。
  • 内容管理系统 :适用于需要灵活数据模型的内容管理系统。
  • 物联网 :适用于需要存储和处理大量传感器数据的物联网应用。

基本命令

  • show dbs :显示所有数据库。
  • use <database> :切换到指定数据库。
  • show collections :显示当前数据库中的所有集合。
  • db.<collection>.find() :查询集合中的所有文档。

参考资料

基本操作示例

插入文档

db.collection.insertOne({ name: "Alice", age: 25, city: "New York" });
db.collection.insertMany([
    { name: "Bob", age: 30, city: "San Francisco" },
    { name: "Charlie", age: 35, city: "Los Angeles" }
]);

查询文档

db.collection.find({ name: "Alice" });
db.collection.find({ age: { $gt: 30 } });

更新文档

db.collection.updateOne({ name: "Alice" }, { $set: { age: 26 } });
db.collection.updateMany({ city: "New York" }, { $set: { city: "Boston" } });

删除文档

db.collection.deleteOne({ name: "Alice" });
db.collection.deleteMany({ age: { $lt: 30 } });

创建索引

db.collection.createIndex({ name: 1 });

使用 Golang 连接 MongoDB

安装 MongoDB Go 驱动

首先,使用 go get 命令安装 MongoDB 的 Go 驱动:

go get go.mongodb.org/mongo-driver/mongo

连接到 MongoDB

以下是一个简单的示例,演示如何使用 Golang 连接到 MongoDB 并进行基本的 CRUD 操作:

package main

import (
    "context"
    "fmt"
    "log"
    "time"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
    // 设置 MongoDB 客户端选项
    clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

    // 连接到 MongoDB
    client, err := mongo.Connect(context.TODO(), clientOptions)
    if err != nil {
        log.Fatal(err)
    }

    // 检查连接
    err = client.Ping(context.TODO(), nil)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Connected to MongoDB!")

    // 获取集合
    collection := client.Database("testdb").Collection("testcollection")

    // 插入文档
    insertResult, err := collection.InsertOne(context.TODO(), bson.D{
        {Key: "name", Value: "Alice"},
        {Key: "age", Value: 25},
        {Key: "city", Value: "New York"},
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Inserted a single document: ", insertResult.InsertedID)

    // 查询文档
    var result bson.M
    err = collection.FindOne(context.TODO(), bson.D{{Key: "name", Value: "Alice"}}).Decode(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Found a single document: ", result)

    // 更新文档
    updateResult, err := collection.UpdateOne(context.TODO(), bson.D{{Key: "name", Value: "Alice"}}, bson.D{
        {Key: "$set", Value: bson.D{
            {Key: "age", Value: 26},
        }},
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)

    // 删除文档
    deleteResult, err := collection.DeleteOne(context.TODO(), bson.D{{Key: "name", Value: "Alice"}})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Deleted %v documents in the collection\n", deleteResult.DeletedCount)

    // 断开连接
    err = client.Disconnect(context.TODO())
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Connection to MongoDB closed.")
}

运行示例

确保 MongoDB 服务正在运行,然后使用以下命令运行上述 Go 程序:

go run main.go

该程序将演示如何连接到 MongoDB、插入文档、查询文档、更新文档和删除文档

定时将 MongoDB 数据添加到 MySQL

以下是一个使用 Golang 定时将 MongoDB 数据添加到 MySQL 的示例:

安装依赖

首先,使用 go get 命令安装所需的依赖:

go get go.mongodb.org/mongo-driver/mongo
go get -u github.com/go-sql-driver/mysql

代码示例

package main

import (
    "context"
    "database/sql"
    "fmt"
    "log"
    "time"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // MongoDB 客户端选项
    mongoClientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

    // 连接到 MongoDB
    mongoClient, err := mongo.Connect(context.TODO(), mongoClientOptions)
    if err != nil {
        log.Fatal(err)
    }
    defer mongoClient.Disconnect(context.TODO())

    // MySQL 数据库连接
    mysqlDB, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/testdb")
    if err != nil {
        log.Fatal(err)
    }
    defer mysqlDB.Close()

    // 定时任务
    ticker := time.NewTicker(1 * time.Hour)
    defer ticker.Stop()

    for {
        select {
        case <-ticker.C:
            transferData(mongoClient, mysqlDB)
        }
    }
}

func transferData(mongoClient *mongo.Client, mysqlDB *sql.DB) {
    // 获取 MongoDB 集合
    collection := mongoClient.Database("testdb").Collection("testcollection")

    // 查询 MongoDB 数据
    cursor, err := collection.Find(context.TODO(), bson.D{})
    if err != nil {
        log.Fatal(err)
    }
    defer cursor.Close(context.TODO())

    // 遍历 MongoDB 数据并插入 MySQL
    for cursor.Next(context.TODO()) {
        var document bson.M
        if err := cursor.Decode(&document); err != nil {
            log.Fatal(err)
        }

        name := document["name"].(string)
        age := document["age"].(int32)
        city := document["city"].(string)

        _, err := mysqlDB.Exec("INSERT INTO users (name, age, city) VALUES (?, ?, ?)", name, age, city)
        if err != nil {
            log.Fatal(err)
        }
    }

    if err := cursor.Err(); err != nil {
        log.Fatal(err)
    }

    fmt.Println("Data transferred from MongoDB to MySQL successfully.")
}

运行示例

确保 MongoDB 和 MySQL 服务正在运行,然后使用以下命令运行上述 Go 程序:

go run main.go

该程序将每小时定时从 MongoDB 查询数据并插入到 MySQL 中。