Golang MongoDB操作

在Golang中使用MongoDB时遇到一个问题:使用官方的mongo-go-driver进行批量插入操作时,当数据量较大(约10万条)时性能明显下降。请问有什么优化建议?比如是否需要调整批量插入的大小,或者是否有其他更高效的写入方式?另外,在插入过程中如果部分文档失败,该如何正确处理错误并继续剩余的插入操作?

2 回复

使用Go操作MongoDB,推荐官方驱动go.mongodb.org/mongo-driver。基本步骤:

  1. 连接数据库:client.Connect()
  2. 选择数据库和集合:client.Database().Collection()
  3. CRUD操作:
    • 插入:InsertOne()
    • 查询:Find()
    • 更新:UpdateOne()
    • 删除:DeleteOne()

注意处理连接错误和上下文超时。

更多关于Golang MongoDB操作的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中操作MongoDB,可以使用官方驱动 go.mongodb.org/mongo-driver。以下是常见操作的示例:

1. 安装驱动

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

2. 连接数据库

package main

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

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

func main() {
    client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))
    if err != nil {
        log.Fatal(err)
    }

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    
    err = client.Connect(ctx)
    if err != nil {
        log.Fatal(err)
    }
    defer client.Disconnect(ctx)

    fmt.Println("Connected to MongoDB!")
}

3. 插入文档

type Person struct {
    Name string `bson:"name"`
    Age  int    `bson:"age"`
}

collection := client.Database("testdb").Collection("people")
person := Person{Name: "Alice", Age: 30}

result, err := collection.InsertOne(ctx, person)
if err != nil {
    log.Fatal(err)
}
fmt.Println("Inserted ID:", result.InsertedID)

4. 查询文档

var result Person
err = collection.FindOne(ctx, bson.M{"name": "Alice"}).Decode(&result)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Found: %+v\n", result)

// 查询多个文档
cursor, err := collection.Find(ctx, bson.M{"age": bson.M{"$gt": 25}})
if err != nil {
    log.Fatal(err)
}
defer cursor.Close(ctx)

for cursor.Next(ctx) {
    var person Person
    cursor.Decode(&person)
    fmt.Printf("Person: %+v\n", person)
}

5. 更新文档

filter := bson.M{"name": "Alice"}
update := bson.M{"$set": bson.M{"age": 31}}

result, err := collection.UpdateOne(ctx, filter, update)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Updated %v documents\n", result.ModifiedCount)

6. 删除文档

result, err := collection.DeleteOne(ctx, bson.M{"name": "Alice"})
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Deleted %v documents\n", result.DeletedCount)

主要操作要点:

  1. 使用 context 控制超时
  2. 通过 bson.M 构建查询和更新条件
  3. 结构体字段使用 bson 标签
  4. 及时关闭连接和游标
  5. 错误处理必不可少

这些操作覆盖了MongoDB的基本CRUD功能,可根据具体需求进行调整扩展。

回到顶部