2016-11-15 39 views
2

我是一個到mongo的新手,使用Java Mongo驅動程序來連接和執行數據庫相關的操作。我已閱讀mongodb中的角色並瞭解角色「dbAdmin」對獲得身份驗證後運行的命令有一些限制。複製收藏MongoDB使用Java沒有Iterator的DbAdmin登錄

我有一個任務是將的集合更新爲封閉的。要做到這一點,從stackoverflow帖子,我已閱讀將集合複製到臨時,刪除舊的,並將此temp重命名爲所需的集合。

我現在在步驟中使用dbAdmin登錄時看到一個問題:複製集合。我使用的代碼是:

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

上調用.iterator(),代碼拋出MongoQueryException說:「沒有被授權就MYDB執行命令{發現: 「testCapped」,過濾器: {}}」

從其他職位,我用這個代碼:

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

在這裏,在dbCursor.hasNext(),代碼會拋出相同的錯誤。 任何替代方案?

  • MongoDB的版本:3.2.10
  • 蒙戈的Java驅動程序:3.2.2
+0

你可以添加stacktrace到帖子嗎? – Veeram

+0

命令失敗,錯誤13:'未授權在myDb上執行命令{convertToCapped:\「testCapped \」,size:120}'在服務器127.0.0.1:27017上。完整響應爲{\「ok \」:0.0,\「errmsg \」:\「nov14Db未授權執行命令{convertToCapped:\\\」testCapped \\\「,size:120} \」,\代碼\「:}}}}}} 我知道它是因爲角色** dbAdmin **沒有像find(),copyTo(),aggregate()等某些特權,但我需要一個解決方法.. –

+0

我只是想知道答案是否有助於解決問題? – notionquest

回答

1

MongoDB的版本 - 3.2.6

蒙戈Java驅動程序 - 3.2.2

請檢查在下面的步驟是否已經一切提到: - 對於具有分配給它的「dbAdmin」角色的用戶需要

1)權限: -

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

2)如果你不沒有爲其分配'dbAdmin'角色的用戶,請使用以下腳本創建用戶'dbAdminUser'並分配適當的角色。您可能需要相應地更改數據庫名稱「test」。

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

3)代碼從開蓋收集複製到封頂收集

這是你有連接到數據庫正確的用戶的類似的代碼。我已經使用在上述步驟中創建的用戶「dbAdminUser」

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(); 

    } 
+0

感謝您的答案..!是的,我知道dbAdmin角色,我試圖玩弄它,並沒有添加「readWrite」特權給他造成的限制。無論如何謝謝你的詳細解釋:) –

+0

如果有幫助,你能否接受答案? – notionquest

+0

完成:) 如果您發現我的問題有用,請升級它,因爲人們可以找到。謝謝 –

0

有你面臨兩種可能的問題(第二個可能會保持爲真,如果如果處理得當第一個解決方案沒有工作):

你沒有驗證

這是簡單的解決,只是驗證使用MongoClient client = new MongoClient(new MongoClientURI("mongodb//user:[email protected]/database"))

更換userpasswordlocalhostdatabase與適當的字符串。

參考:mongodb authentcation

你沒有適當的角色

對於此創建一個用戶,你就不得不提到mongodb creating user with specific role代替。

+0

謝謝爲eff但它對我無用。我已經完成了驗證用戶的所有步驟。關於角色,如果dbAdmin沒有包含在java中的「readWrite」特權,我嘗試了任何可能性。 –