You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Go中使用MongoDB Atlas连接及服务器选择超时问题解决

MongoDB Atlas连接超时问题排查及Go连接指南

问题描述

尝试用Go连接MongoDB Atlas时遇到服务器选择超时错误,同时希望了解Go中连接MongoDB Atlas的正确方法。

错误信息

selection error: server selection timeout, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: ac-pjyudwq-shard-00-01.1bnb2bm.mongodb.net:27017, Type: Unknown, Last error: dial tcp 3.6.207.111:27017: i/o timeout }, { Addr: ac-pjyudwq-shard-00-00.1bnb2bm.mongodb.net:27017, Type: Unknown, Last error: dial tcp 3.7.150.83:27017: i/o timeout }, { Addr: ac-pjyudwq-shard-00-02.1bnb2bm.mongodb.net:27017, Type: Unknown, Last error: dial tcp 3.7.137.42:27017: i/o timeout }, ] } exit status 1

当前使用的代码

const MONGOURL = "mongodb+srv://sai:sai@cluster0.1bnb2bm.mongodb.net/?retryWrites=true&w=majority"

var collection *mongo.Collection

func init() {
    fmt.Println("in the init function") var databasename string = "GOAPI"
    var collectionname string = "Movies"
    client, err: = mongo.Connect(context.TODO(), options.Client().ApplyURI(MONGOURL)) if err != nil {
        fmt.Println("unable to get mongo connection ") log.Fatal(err)
    }
    collection = ( * mongo.Collection)(client.Database(databasename).Collection(collectionname)) fmt.Println("sucessfully collection is created ") doc: = Movie {
        Name: "rrr",
        Watched: false,
        Rating: 9,
        Id: "12121"
    }
    result, err: = collection.InsertOne(context.Background(), doc) if err != nil {
        log.Fatal("hey unable to insert one ", err)
    }
    fmt.Println("sucessfully added : ", result.InsertedID)

    // mongo.Connect()`your text`
}

问题排查及解决方案

1. 网络与IP白名单问题

从错误里的dial tcp ... i/o timeout可以看出,本地机器无法连通Atlas集群节点,优先检查:

  • 确认当前机器的公网IP已添加到MongoDB Atlas的IP白名单(Atlas控制台→集群→网络访问→添加IP地址,可临时加0.0.0.0/0测试,生产环境禁用)
  • 检查本地防火墙、代理是否拦截了27017端口的出站请求
  • 尝试ping Atlas节点地址(如ac-pjyudwq-shard-00-01.1bnb2bm.mongodb.net),确认域名解析和网络连通性

2. 连接字符串验证

  • 确认连接字符串里的用户名、密码正确,密码含特殊字符需做URL编码
  • 核对集群地址是否与Atlas控制台提供的一致,避免手动输入错误

3. 代码优化建议

原代码存在格式问题,且缺少连接校验步骤,优化后的示例:

package main

import (
    "context"
    "fmt"
    "log"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

const MONGOURL = "mongodb+srv://sai:sai@cluster0.1bnb2bm.mongodb.net/?retryWrites=true&w=majority"

var collection *mongo.Collection

type Movie struct {
    Name    string `bson:"name"`
    Watched bool   `bson:"watched"`
    Rating  int    `bson:"rating"`
    Id      string `bson:"_id"`
}

func init() {
    fmt.Println("in the init function")
    databasename := "GOAPI"
    collectionname := "Movies"

    // 配置客户端选项
    clientOpts := options.Client().ApplyURI(MONGOURL)
    // 建立连接
    client, err := mongo.Connect(context.TODO(), clientOpts)
    if err != nil {
        log.Fatal("无法建立MongoDB连接: ", err)
    }

    // 校验连接有效性
    err = client.Ping(context.TODO(), nil)
    if err != nil {
        log.Fatal("连接校验失败: ", err)
    }
    fmt.Println("成功连接到MongoDB Atlas")

    collection = client.Database(databasename).Collection(collectionname)
    fmt.Println("集合初始化完成")

    doc := Movie{
        Name:    "rrr",
        Watched: false,
        Rating:  9,
        Id:      "12121",
    }
    result, err := collection.InsertOne(context.Background(), doc)
    if err != nil {
        log.Fatal("插入文档失败: ", err)
    }
    fmt.Println("文档插入成功,ID: ", result.InsertedID)
}

func main() {
    // init函数会自动执行,主函数留空即可
}

4. Go连接MongoDB Atlas的标准步骤

  1. 安装驱动:执行go get go.mongodb.org/mongo-driver/mongo安装官方Go驱动
  2. 获取连接字符串:在Atlas控制台→集群→连接→连接应用程序,选择Go语言,复制生成的字符串并替换用户名、密码
  3. 初始化客户端并校验:用mongo.Connect创建客户端,必须调用client.Ping确认连接成功
  4. 操作集合:通过客户端实例获取数据库和集合,执行增删改查操作
  5. 关闭连接:程序退出前调用client.Disconnect(context.TODO())释放资源

内容的提问来源于stack exchange,提问作者cherry brezzy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:35:41