Go语言操作MongoDB:使用官方驱动实现增删改查

雨后青山
雨后青山
发布时间:2026-10-14| 4人浏览过
原创

本文提供使用Go语言标准官方驱动连接和操作MongoDB的完整示例,包括依赖管理、建立连接、批量插入数据以及按条件查询记录的正确姿势。

准备环境

过去常用的 mgo 库已不再维护,目前推荐使用官方发布的 go.mongodb.org/mongo-driver。在开始编写代码前,请确保本地已安装Go环境和MongoDB服务(默认端口 127.0.0.1:27017)。

第1步:安装官方驱动

在项目目录下初始化模块并安装驱动:

go mod init myapp
go get go.mongodb.org/mongo-driver/mongo

完整操作示例

以下示例演示了如何定义结构体、连接数据库、插入多条数据并执行查询。该代码基于最新的官方API重写,修正了旧版 mgo 库中存在的语法限制和依赖问题。

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"
)

// Mail 定义集合结构
type Mail struct {
    ID    string `bson:"_id"`
    Name  string `bson:"name"`
    Email string `bson:"email"`
}

func main() {
    // 1. 设置客户端选项和上下文
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()

    clientOptions := options.Client().ApplyURI("mongodb://127.0.0.1:27017")

    // 2. 连接到MongoDB
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
        log.Fatal(err)
    }
    defer func() { _ = client.Disconnect(ctx) }()

    // 验证连接
    if err := client.Ping(ctx, nil); err != nil {
        log.Fatal("Ping failed: ", err)
    }
    fmt.Println("Successfully connected!")

    // 3. 获取集合引用
    collection := client.Database("test").Collection("mail")

    // 4. 插入数据
    m1 := Mail{ID: "id1", Name: "user1", Email: "user1@example.com"}
    m2 := Mail{ID: "id2", Name: "user1", Email: "user2@example.com"}
    m3 := Mail{ID: "id3", Name: "user3", Email: "user3@example.com"}

    insertDocs := []interface{}{m1, m2, m3}
    result, err := collection.InsertMany(ctx, insertDocs)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Inserted %d documents\n", len(result.InsertedIDs))

    // 5. 查询数据
    filter := bson.M{"name": "user3"}
    cursor, err := collection.Find(ctx, filter)
    if err != nil {
        log.Fatal(err)
    }
    defer cursor.Close(ctx)

    var results []Mail
    if err = cursor.All(ctx, &results); err != nil {
        log.Fatal(err)
    }

    for _, r := range results {
        fmt.Printf("Name: %s, Email: %s\n", r.Name, r.Email)
    }
}

关键步骤解析

  • 上下文控制(Context):所有MongoDB操作都支持Context,用于设置超时时间和取消信号,防止程序挂起。
  • BSON序列化:使用 go.mongodb.org/mongo-driver/bson 处理文档转换,注意结构体标签需正确对应数据库字段名。
  • 连接复用:mongo.Client 是线程安全的,适合在应用生命周期内复用,而不是每次请求都新建连接。

完成判断

运行上述代码后,若终端输出 Successfully connected! 及插入/查询结果,说明Go已成功连接并操作MongoDB。检查MongoDB实例中的 test.mail 集合,应包含新增的文档。

排错指南

  1. 连接拒绝:若提示 “connection refused”,请检查MongoDB服务是否启动(systemctl status mongod 或 docker ps)。
  2. 认证失败:如果开启了认证,需在URI中添加用户名密码参数,如 mongodb://user:pass@localhost。
  3. 版本不兼容:确保Go版本 >= 1.18,MongoDB服务器版本较新时可能需要调整驱动版本。

以上就是Golang操作MongoDB的详细方法,更多关于Go语言数据库交互的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。