我花了一些时间试图弄清楚出了什么问题,但由于我无法找到,我决定在这里问。
我在Windows 8上运行MongoDB(Windows 64位2008 R2 +)版本3.2.3,路径为:
安装C:\ MongoDB \ bin
数据文件夹的C:\ data \ db
我已在官方文档中安装了以下this video和this tutorial。
第一个问题可能是,因为我根本不知道它是否是一个问题,客户端(mongo.exe)和服务器(mongod.exe)之间的连接。
我通过命令行启动了mongod.exe(具有管理员权限),一切都很顺利,我收到了消息:
waiting for connections on port 27017
但是当我通过命令行的新实例启动mongo.exe时,服务器(mongod.exe)不会打印一条消息,说明有新连接(我观看的教程就是这种情况)< / p>
另一方面,mongo.exe打印
connecting to : test
我不知道此时一切是否正确,但我仍然尝试了一些基本命令,如:
show dbs
返回not authorized on admin to execute command
基本上,我尝试过的所有命令都有相同的错误信息,即使我使用use 'dbName'
创建的“新鲜”数据库
网上的一些答案说我必须创建一个具有适当角色的用户,我试过this one。
仍然是相同的错误消息not authorized to execute command
我的问题如下:
启动mongo.exe时mongod.exe没有显示新连接是正常的吗?如果它是正确的,那么即使基本命令也可以做什么呢?
其他信息:
我试图在Windows安装程序中使用“自定义模式”和“完成模式”卸载/重新安装几次,但它总会导致同样的问题。
我还尝试按照官方文档创建一个MongoDB服务,但我不确定这是不是一个好主意。 (我无法添加更多链接,但它位于我分享的第二个链接的一个部分。
编辑部分:
我决定在另一台计算机上试用它,这台计算机多年来一直没有触及,在Windows 7 64位上运行。
我将MongoDB安装文件夹复制到此计算机的根目录下,创建了\ data \ db文件夹并启动了mongod.exe。
然后我启动了mongo.exe,这次,mongod.exe打印了一条消息,说有一个新的打开连接,它不在我的实际计算机上。我认为问题出在这里是因为我能够从官方文档开始基本教程,并执行简单的命令,如创建新的数据库,插入,查找,显示数据库等等。我无法在我的实际计算机上执行的所有操作
所以我认为问题来自mongod.exe和mongo.exe之间的连接
您是否知道如何解决此问题,因为我已尝试卸载几次。
答案 0 :(得分:27)
您应该已启动具有访问控制的mongod实例,即the --auth command line option,例如:
$ mongod --auth
让我们启动mongo shell,并在admin数据库中创建一个管理员:
$ mongo
> use admin
> db.createUser(
{
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
现在,如果您运行命令“db.stats()”或“show users”,您将收到错误“管理员未授权执行命令...”
> db.stats()
{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { dbstats: 1.0, scale: undefined }",
"code" : 13,
"codeName" : "Unauthorized"
}
原因是您仍未向用户myUserAdmin授予角色“read”或“readWrite”。你可以这样做:
> db.auth("myUserAdmin", "abc123")
> db.grantRolesToUser("myUserAdmin", [ { role: "read", db: "admin" } ])
现在你可以验证它(命令“show users”现在有效):
> show users
{
"_id" : "admin.myUserAdmin",
"user" : "myUserAdmin",
"db" : "admin",
"roles" : [
{
"role" : "read",
"db" : "admin"
},
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
现在,如果您运行“db.stats()”,您也可以:
> db.stats()
{
"db" : "admin",
"collections" : 2,
"views" : 0,
"objects" : 3,
"avgObjSize" : 151,
"dataSize" : 453,
"storageSize" : 65536,
"numExtents" : 0,
"indexes" : 3,
"indexSize" : 81920,
"ok" : 1
}
除了admin数据库之外,此用户和角色机制也可以应用于MongoDB中的任何其他数据库。
(MongoDB版本3.4.3)
答案 1 :(得分:12)
创建这样的用户:
db.createUser(
{
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
然后按照以下方式连接:
mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
查看手册:
https://docs.mongodb.org/manual/tutorial/enable-authentication/
答案 2 :(得分:9)
另外,在按照cmd-1创建用户之后,请通过cmd-2为用户分配读/写/ root角色。然后通过cmd&#34; mongod --auth&#34;重新启动mongodb。
为用户分配角色的好处是你可以通过mongo shell或python / java等进行读/写操作,否则你将遇到&#34; pymongo.errors.OperationFailure:未授权&#34;当你尝试读/写你的数据库时。
CMD-1:
use admin
db.createUser({
user: "newUsername",
pwd: "password",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
CMD-2:
db.grantRolesToUser('newUsername',[{ role: "root", db: "admin" }])
答案 3 :(得分:6)
回答问题OP的副本:
<强>解决方案强>
从上一次编辑更新后,我看了一下客户端和服务器之间的连接,我发现即使mongod.exe没有运行,仍然有东西在端口上侦听27017 netstat -a
所以我尝试使用随机端口启动服务器
[dir]mongod.exe --port 2000
然后用
的shell[dir]mongo.exe --port 2000
这一次,服务器打印出一条消息,说有一个新的连接。 我输入了一些命令,一切都运行得很好,我从文档中开始了基本教程,检查它是否正常,现在是。
答案 4 :(得分:1)
有两件事,
1)您可以先运行没有用户名和密码的mongodb实例。
2)然后你可以使用下面的查询将用户添加到mongodb的系统数据库中,这是默认的。
db.createUser({
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
感谢。
答案 5 :(得分:0)
在我的案例中,这是Docker在后台运行。如果您已安装Docker,则可能要关闭它,然后重试。
答案 6 :(得分:0)
对我来说,通过添加
1)“您可以先运行不带用户名和密码的mongodb实例。---确定
2)“然后,您可以使用以下查询将用户添加到mongodb的系统数据库中,该数据库是默认数据库。” ---确定
db.createUser({
user: "myUserAdmin",
pwd: "abc123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ],
mechanisms:[ "SCRAM-SHA-1" ] // I added this line
})