2016-11-15 2 views
2

Я новичок в mongo, используя Java Mongo Driver для подключения и выполнения операций, связанных с db. Я прочитал о ролях в mongodb и осознал, что в роли «dbAdmin» есть некоторые ограничения на команды, которые он запускает после проверки подлинности.Копия коллекции Mongo DB с использованием Java без Iterator для входа в DbAdmin

У меня есть задача обновить коллекцию от UnCapped to capped. Чтобы сделать это, из postupflow posts, я прочитал, чтобы скопировать коллекцию в temp, удалить старый и переименовать эту 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-Driver: 3.2.2
+0

Можете ли вы добавить stacktrace в сообщение? – Veeram

+0

Сбой команды с ошибкой 13: 'не разрешено myDb выполнять команду {convertToCapped: \ "testCapped \", размер: 120}' на сервере 127.0.0.1:27017. Полный ответ: {\ "ok \": 0.0, \ "errmsg \": \ "не авторизовано в nov14Db для выполнения команды {convertToCapped: \\\" testCapped \\\ ", size: 120} \", \ " code \ ": 13}"}}} Я знаю его из-за роли ** dbAdmin ** не имеет определенных привилегий, таких как find(), copyTo(), aggregate() и т. д., но мне нужна работа .. –

+0

Мне просто интересно, полезен ли ответ для решения проблемы? – notionquest

ответ

1

MongoDB версия - 3.2.6

Монго Java Driver - 3.2.2

Пожалуйста, проверьте, были ли все упомянутые в следующей стадии: -

1) Привилегии, требуемые для пользователя, который имеет роль «dbAdmin», возложенные на него: -

> 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

Done :) Если вы найдете мой вопрос полезным, пожалуйста, оцените его, как могут найти люди. Спасибо –

0

Есть два возможных проблем вы столкнулись (Второй один, вероятно, справедливы, если первое решение не будет работать, если все сделано правильно):

Вы не аутентифицировать

Это просто решить, только проверку подлинности с помощью MongoClient client = new MongoClient(new MongoClientURI("mongodb//user:[email protected]/database"))

заменить user, password, localhost и database с соответствующей строкой.

ссылка: mongodb authentcation

Вы не создать пользователя с соответствующей ролью

Для этого, вам придется обратиться к mongodb creating user with specific role вместо этого.

+0

Спасибо для эфф ort, но это не полезно для меня. Я уже прошел все этапы аутентификации пользователя. Что касается роли, я пытался использовать любую возможность существования, если у dbAdmin нет привилегии «readWrite», включенной в java. –

Смежные вопросы