From 7644462180b4ae2f4ee1347d4d8dd89922c94f2c Mon Sep 17 00:00:00 2001 From: Syngnat Date: Tue, 10 Mar 2026 10:32:31 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(mongodb):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=8D=95=E6=9C=BA=E6=A8=A1=E5=BC=8F=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E5=89=AF=E6=9C=AC=E9=9B=86=E5=AE=9E=E4=BE=8B=E6=97=B6=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E8=A2=AB=E6=9B=BF=E6=8D=A2=E4=B8=BA=E5=86=85=E7=BD=91?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getURI 在 topology=single 时未设置 directConnection=true - 驱动连接目标地址后自动跟随副本集成员发现,切换到 localhost:27017 - 在 mongodb_impl.go 和 mongodb_impl_v1.go 中添加 directConnection=true - 仅在 topology 非 replica、无 replicaSet、非 SRV 时生效 - refs #205 --- internal/db/mongodb_impl.go | 5 +++++ internal/db/mongodb_impl_v1.go | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/internal/db/mongodb_impl.go b/internal/db/mongodb_impl.go index 5c853f6..27ac0c7 100644 --- a/internal/db/mongodb_impl.go +++ b/internal/db/mongodb_impl.go @@ -251,6 +251,11 @@ func (m *MongoDB) getURI(config connection.ConnectionConfig) string { params.Set("authMechanism", authMechanism) } + // 单机模式且未指定副本集名称时,启用 directConnection 避免驱动自动跟随副本集成员发现 + if strings.TrimSpace(config.Topology) != "replica" && strings.TrimSpace(config.ReplicaSet) == "" && !config.MongoSRV { + params.Set("directConnection", "true") + } + if encoded := params.Encode(); encoded != "" { uri += "?" + encoded } diff --git a/internal/db/mongodb_impl_v1.go b/internal/db/mongodb_impl_v1.go index 26e110a..e3aa5b4 100644 --- a/internal/db/mongodb_impl_v1.go +++ b/internal/db/mongodb_impl_v1.go @@ -252,6 +252,11 @@ func (m *MongoDBV1) getURI(config connection.ConnectionConfig) string { params.Set("authMechanism", authMechanism) } + // 单机模式且未指定副本集名称时,启用 directConnection 避免驱动自动跟随副本集成员发现 + if strings.TrimSpace(config.Topology) != "replica" && strings.TrimSpace(config.ReplicaSet) == "" && !config.MongoSRV { + params.Set("directConnection", "true") + } + if encoded := params.Encode(); encoded != "" { uri += "?" + encoded }