使用Java而不使用Iterator复制A Collection Mongo DB以进行DbAdmin登录

时间:2016-11-15 12:30:08

标签: java mongodb mongodb-java

我是mongo的新手,使用 Java Mongo Driver 连接并执行与数据库相关的操作。我已经阅读了mongodb中的角色,并且知道角色“dbAdmin”对他在获得身份验证后运行的命令有一些限制。

我的任务是将集合从 UnCapped更新为上限。为此,从stackoverflow帖子中,我已阅读将集合复制到temp,删除旧集合并将此temp重命名为所需集合。

我现在看到dbAdmin登录的一个问题:复制集合。我使用的代码是:

MongoCursor<Document> cur = selectedCollection.find().iterator();
while (cur.hasNext()) {
    Document obj = cur.next();
    tempCollection.insertOne(obj);
}

在调用.iterator()时,代码抛出MongoQueryException,说“未在myDb上授权执行命令{find:”testCapped“,filter:{}}”

在其他帖子中,我使用了以下代码:

DBCursor dbCursor = mongoInstance.getDB(dbName)
    .getCollection(selectedCollectionName)
    .find();
while (dbCursor.hasNext()){
    //
}

在此{@ 1}}中,代码会抛出相同的错误..! 对此有何选择?

  • MongoDB版本: 3.2.10
  • Mongo-Java-Driver: 3.2.2

2 个答案:

答案 0 :(得分:1)

MongoDB版本 - 3.2.6

Mongo Java Driver - 3.2.2

请检查您是否拥有以下步骤中提到的所有内容: -

1)具有&#39; dbAdmin&#39;的用户所需的权限分配给它的角色: -

> db.getUser("dbAdminUser");
{
        "_id" : "test.dbAdminUser",
        "user" : "dbAdminUser",
        "db" : "test",
        "roles" : [
                {
                        "role" : "dbAdmin",
                        "db" : "test"
                },
                {
                        "role" : "readWrite",
                        "db" : "test"
                }
        ]
}

2)如果您没有拥有“dbAdmin”的用户。分配给它的角色,使用下面的脚本创建用户&#39; dbAdminUser&#39;并指定适当的角色。您可能需要更改数据库名称&#34; test&#34;相应

db.createUser( { user: "dbAdminUser",
                 pwd: "password",
                 roles: [ { role: "dbAdmin", db: "test" },                          
                          "readWrite"] },
               { w: "majority" , wtimeout: 5000 } );

3)从无上限集合复制到上限集合的代码

这是与正确的用户连接到数据库时相似的代码。我使用了上面步骤中创建的用户&#34; dbAdminUser&#34;

public static void main(String[] args) {

        MongoClient mongoClient = null;
        MongoCredential mongoCredential = MongoCredential.createScramSha1Credential("dbAdminUser", "test",
                "password".toCharArray());

        mongoClient = new MongoClient(new ServerAddress("localhost", 27017), Arrays.asList(mongoCredential));

        DB db = mongoClient.getDB("test");

        DBCursor dbCursor = db.getCollection("Account").find();

        while (dbCursor.hasNext()) {
            DBObject dbObject = dbCursor.next();
            System.out.println(dbObject);
            db.getCollection("AccountCapped").insert(dbObject);         
        }

        mongoClient.close();

    }

答案 1 :(得分:0)

你面临两个可能的问题(如果第一个解决方案在正确完成后无法正常工作,第二个可能会成立):

您未进行身份验证

这很容易解决,只需使用MongoClient client = new MongoClient(new MongoClientURI("mongodb//user:password@localhost/database"))

进行身份验证即可

用适当的字符串替换userpasswordlocalhostdatabase

参考:mongodb authentcation

您没有创建具有适当角色的用户

为此,您必须改为引用mongodb creating user with specific role