测试go脚本:读取ini文件数据,然后将数据写入mongodb。结果调试日志提示成功,都能看到新增数据后的ObjectId,可是在navicat里却死活看不到新建的Collection。
最终检查出来,有2个原因导致:
在go脚本里,连接mongodb时,有一个如下拼接字符串的操作:
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:
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字段,那它们之间有什么区别呢?
理解了这个问题,刚才上面提到的AUTH_DB和DB_NAME也就好理解了。
登录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。
上面的新增用户命令,咱们也可以分两步来操作:
这样创建的用户,就属于在选择的数据库之下。命令如下所示:
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:
use admin;
db.getCollection("v_TC111-111").find();
结果也验证了我的答案,如下图所示,就是collection确实创建了,数据也插入成功了,只是在客户端看不到而已: