文章大纲

go mongodb插入数据提示成功,navicat里却根本看不到

2025-05-30 10:49:53

问题描述

测试go脚本:读取ini文件数据,然后将数据写入mongodb。结果调试日志提示成功,都能看到新增数据后的ObjectId,可是在navicat里却死活看不到新建的Collection。


问题原因

最终检查出来,有2个原因导致:

  1. 同事配置的mongodb账号权限有问题
  2. go代码问题

在go脚本里,连接mongodb时,有一个如下拼接字符串的操作:

go
connectURI = fmt.Sprintf("mongodb://%v:%v@%v:%v/%v", serverIpInfo["mongo_db_user"], serverIpInfo["mongo_db_password"],
			serverIpInfo["mongo_db_address"], serverIpInfo["mongo_db_port"], serverIpInfo["mongo_db_name"])

结构含义如下:

mongodb://USERNAME:PASSWORD@SERVER_IP:PORT/AUTH_DB

通过上面字符串连接mongodb后,接着需要下面这行代码来选择DB:

go
db = client.Database(DB_NAME)

这里AUTH_DB和DB_NAME不是一个东西,结果却被我疏忽混用了,才导致我在navicat里看不到新增的数据。

AUTH_DB是用来验证账号归属的
DB_NAME是业务数据存储所在的数据库名

还没看懂没关系,咱们接着往后看。


本文为翟码农个人博客mongodb分类下的原创文章,记录的工作中处理任务耗时有点久的经历,转载还请注明出处:http://www.zhai14.com/blog/unable-to-see-the-new-inserted-data-by-go-mongodb-script-in-navicat.html


两个db字段的区别

添加用户命令里有两个db字段,那它们之间有什么区别呢?

理解了这个问题,刚才上面提到的AUTH_DB和DB_NAME也就好理解了。

登录mongodb后,可以通过如下命令来添加新用户:

mongodb
db.createUser({
  db: "admin"
  user: "coderzhai",
  pwd: "YreksFgbTk",
  roles: [{ role: "readWrite", db: "labdata" }]
});


可以看到外面有个db字段,roles里面也有个db字段。

外面这个db,就相当于AUTH_DB,表示当前我要新增的coderzhai用户数据是在admin数据库下,admin数据库也是mongodb的默认数据库,上面用go连接mongodb的那一大串字符串,末尾就是它。所以在mongodb客户端里连接mongodb时也需要填写这个参数,位置如下图所示:(下图是navicat客户端界面)



我这次项目数据存在labdata数据库里,如果我们需要coderzhai用户有权限对labdata数据库进行读写,就需要在roles里将labdata配置进去。

因此前面提到的AUTH_DB,就对应这个新增用户命令里的外面db:admin;DB_NAME就对应labdata。


上面的新增用户命令,咱们也可以分两步来操作:

  1. 先选择数据库
  2. 再创建用户

这样创建的用户,就属于在选择的数据库之下。命令如下所示:

mongodb
use admin;
db.createUser({
  user: "coderzhai",
  pwd: "YreksFgbTk",
  roles: [{ role: "readWrite", db: "labdata" }]
});


踩坑之处分析

同事创建的用户,两个db都是用的admin,而我在代码里也恰巧都共用了serverIpInfo["mongo_db_name"]这个变量,值也是admin。

虽然admin是mongodb默认数据库,可是在navicat客户端工具里,我根本就看不到它,只能看到业务数据库labdata。

也就是说,我调试的日志提示数据添加成功,的确是成功了,只不过是添加到admin数据库里了。我在客户端labdata数据库里使劲刷新,当然是不会有任何发现了。


进服务器通过命令登录进去后,我查询我要创建的collection:

mongodb
use admin;
db.getCollection("v_TC111-111").find();

结果也验证了我的答案,如下图所示,就是collection确实创建了,数据也插入成功了,只是在客户端看不到而已:





我要评论
评论列表