我是MongoDB的新手。我正在尝试通过Java Driver在MongoDB中为数据库创建用户。我正在使用 mongo-java-driver 3.0.1 版本。我在谷歌搜索,我没有找到相关的答案。我看到 mongo-java-driver 2.13.0 中有直接方法,但在最新版本中已弃用。我尝试使用以下代码创建用户,但我得到了例外。
代码:
MongoClient mongoClient = new MongoClient("127.0.0.1","27017");
MongoDatabase mongoDatabase = this.mongoClient
.getDatabase(doc);
BasicDBObject commandArguments = new BasicDBObject();
commandArguments.put("user", mongoDatabase.getName());
commandArguments.put("pwd", "Cip#erCloud@123");
String[] roles = { "readWrite" };
commandArguments.put("roles", roles);
BasicDBObject command = new BasicDBObject("createUser",
commandArguments.toString());
mongoDatabase.runCommand(command);
例外:
com.mongodb.MongoCommandException: Command failed with error 2: 'Must provide a 'pwd' field for all user documents, except those with '$external' as the user's source db' on server 127.0.0.1:27017.
The full response is { "ok" : 0.0, "errmsg" : "Must provide a 'pwd' field for all user documents, except those with '$external' as the user's source db", "code" : 2 }
以下是我的问题:
注意:我正在使用JAVA库。
请有人帮我解决这个问题。我卡在这里。
谢谢&此致,Amar
答案 0 :(得分:8)
你可以试试这个来创建用户:
Error in `[.data.frame`(out, , obsLevels, drop = FALSE) :
undefined columns selected
答案 1 :(得分:3)
这两种方式对我都不起作用。但是这种方式有效:
final MongoDatabase db = mongoClient.getDatabase("myDatabase");
final BasicDBObject createUserCommand = new BasicDBObject("createUser", "myuser").append("pwd", "mypassword").append("roles",
Collections.singletonList(new BasicDBObject("role", "dbOwner").append("db", "myDatabase")));
db.runCommand(createUserCommand);
答案 2 :(得分:0)
我需要在测试用例中创建一个用户。如果用户已经存在,运行createUser命令将引发异常。在尝试创建用户之前,我添加了一些代码以删除该用户(如果存在),以便该异常不会出现在单元测试日志中。对于我来说,添加此代码然后捕获异常,验证它是否适用于现有用户帐户并忽略它比较容易。
要使用它,您需要设置用户名,密码和TEST_DATABASE_NAME。
Document result = null;
MongoDatabase db = mongo.getDatabase(TEST_DATABASE_NAME);
BasicDBObject getUsersInfoCommand = new BasicDBObject("usersInfo",
new BasicDBObject("user", username).append("db", TEST_DATABASE_NAME));
BasicDBObject dropUserCommand = new BasicDBObject("dropUser", username);
BasicDBObject createUserCommand = new BasicDBObject("createUser", username).append("pwd", password).append("roles",
Collections.singletonList(new BasicDBObject("role", "dbOwner").append("db", TEST_DATABASE_NAME)));
// If test user exists from a previous run, drop it
result = db.runCommand(getUsersInfoCommand);
ArrayList users = (ArrayList) result.get("users");
if (!users.isEmpty()) {
db.runCommand(dropUserCommand);
}
db.runCommand(createUserCommand);
更好的做法是在测试完成后删除用户,但是我在@AfterClass方法中拥有了代码,该方法实际上是该测试的一部分,这会使共享此代码示例更加复杂。
答案 3 :(得分:0)
关于使用HashMap的Devender答案中的代码:
Map
HashMap不能保证迭代时项目的顺序,因此,如果说“角色”最先出现,则runCommand请求可能会失败。 我遇到了这个问题。
使用LinkedHashMap代替HashMap <>解决了该问题,因为它通常按插入顺序进行迭代。