MongoDB 连接时的**认证参数配置错误**

该错误是 MongoDB 连接时的认证参数配置错误 ,核心原因是 MongoCredential(认证凭证)中缺少"认证数据库名"(source 字段为空),导致 MongoDB 无法识别认证范围,最终连接超时失败。以下是分步解决方案:

一、错误核心原因解析

MongoDB 认证时需要明确"基于哪个数据库验证账号密码"(默认是 admin 数据库,除非手动在其他库创建账号)。你的连接代码中,MongoCredentialsource 字段为空(source=''),MongoDB 无法确定认证数据库,抛出"databaseName is not empty"异常,进而导致连接超时。

二、解决方案:补充"认证数据库名"

根据 MongoDB 账号的创建场景(默认 admin 库或自定义库),分两种情况配置连接:

1. 情况1:账号在默认 admin 库创建(最常见)

若你的 root 账号是在 admin 数据库下创建的(MongoDB 默认管理员账号存储在 admin 库),连接时需指定 source="admin"(即认证数据库为 admin)。

示例代码(Java 驱动为例):
java 复制代码
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import java.util.Arrays;

public class MongoConnTest {
    public static void main(String[] args) {
        // 1. 配置认证信息:必须指定 source(认证数据库名,这里是 admin)
        MongoCredential credential = MongoCredential.createCredential(
                "root",          // 用户名
                "admin",         // 认证数据库名(关键!不能为空,默认填 admin)
                "你的密码".toCharArray()  // 密码
        );

        // 2. 配置服务器地址(localhost:27017)
        ServerAddress serverAddress = new ServerAddress("localhost", 27017);

        // 3. 建立连接
        MongoClient mongoClient = new MongoClient(serverAddress, Arrays.asList(credential));

        // 4. 测试连接(查询数据库列表,无异常则成功)
        System.out.println(mongoClient.listDatabaseNames().into(new ArrayList<>()));
    }
}
2. 情况2:账号在自定义数据库创建(非 admin 库)

若你的 root 账号是手动在其他数据库(如 mydb)下创建的(例如 use mydb; db.createUser(...)),则 source 需填该自定义数据库名(如 source="mydb")。

示例(以自定义库 mydb 为例):
java 复制代码
// 认证数据库改为自定义的 mydb
MongoCredential credential = MongoCredential.createCredential(
        "root", 
        "mydb",  // 自定义认证数据库名
        "你的密码".toCharArray()
);

三、额外排查步骤(确保基础环境正常)

  1. 确认 MongoDB 服务已启动

    执行命令检查服务状态(Windows):net start MongoDB;(Linux):systemctl status mongod,确保服务处于"运行中"。

  2. 验证账号密码正确性

    通过 mongo shell 手动登录,确认账号密码无误:

    bash 复制代码
    # 1. 连接 MongoDB(先不认证)
    mongo localhost:27017
    
    # 2. 切换到认证数据库(如 admin)
    use admin
    
    # 3. 执行认证(替换为你的账号密码)
    db.auth("root", "你的密码")
    
    # 若返回 1 表示认证成功;返回 0 表示账号/密码错误

    db.auth 返回 0,需先重置密码(如 db.changeUserPassword("root", "新密码"))。

  3. 检查端口是否被占用

    执行命令查看 27017 端口是否被 MongoDB 占用(Windows):netstat -ano | findstr "27017";(Linux):netstat -tuln | grep 27017,确保端口未被其他程序占用。

四、总结

该错误的关键修复点 是给 MongoCredential 补充"认证数据库名"(source 字段),默认填 admin(99% 的场景适用),若账号在自定义库创建则填对应库名。补充后重新连接,即可解决"databaseName is not empty"和连接超时问题。

相关推荐
金仓拾光集27 分钟前
金仓替代MongoDB:安全与性能协同提升——社交用户画像系统的国产化实践
数据库·安全·mongodb·kingbase·kingbasees·数据库平替用金仓·金仓数据库
FinTech老王29 分钟前
国产数据库替换MongoDB实战:浙江人民医院电子病历系统国产化升级案例
数据库·mongodb
l1t31 分钟前
在Lua用luasql-sqlite3库访问SQLite数据库
数据库·git·sqlite·lua
2501_938780281 小时前
《轨道交通检测系统中 Qt 与数据库交互的优化方案》
数据库·qt·交互
qqxhb1 小时前
系统架构设计师备考第61天——嵌入式系统架构模式&操作系统&数据库&中间件
数据库·中间件·系统架构·sqlite·dds·层次化(封闭/开放)·递归模式
SelectDB1 小时前
Apache Doris 数据导入原理与性能优化 | Deep Dive
运维·数据库·数据分析
悟能不能悟2 小时前
在service方法中已经catch异常,Transactional失效怎么办
java·数据库·sql
月夜奇术师2 小时前
SQL查询性能优化:从30分钟到30秒的蜕变——破解串行查询瓶颈
数据库·性能优化
zimoyin2 小时前
解决导入的数据库中因为 sql_mode 不同 视图无法打开问题
数据库·sql
程序边界3 小时前
MySQL至KingbaseES迁移最佳实践(上篇):迁移准备与实施规划
数据库·mysql