Mongo / Java findAndReplace не работает - PullRequest
0 голосов
/ 03 февраля 2011

У меня есть такая коллекция Монго

email{
"isConfirmed" : true/[or false]
"email" : "xxxxxxxxxxx"
}

Когда я пытаюсь обновить поле isConfirmed на true или false, в зависимости от электронной почты, которая, по-видимому, является уникальной, это занимает много лет.

Я использую язык программирования Java

Вот мой код.

List<String> clientEmails = new ArrayList<String>();

Mongo mongoConnection = new Mongo();

DB mongoDatabase = mongoConnection.getDB(DB_NAME);

DBCollection mongoCollection = mongoDatabase.getCollection(COLLECTION_NAME);

int size = clientEmails.size();

for(int i=0;
i
<
size; i++)

{

    BasicDBObject query = new BasicDBObject();

    System.out.println(clientEmails.get(i).toString());

    query.put("email.email", clientEmails.get(i).toString());

    BasicDBObject Update = new BasicDBObject("$set", new   BasicDBObject("email.isConfirmed", false));

    mongoCollection.update(query, Update); 

Этому нужно пройти целую вечность, чтобы просмотреть коллекцию, состоящую из около 3500 записей]

  //mongoCollection.findAndModify(query, Update);

Даже findAndModify не работает вообще, я не уверен, что я что-то здесь упускаю

Тем не менее, я попытался с DBcursor, он работает, но для запуска требуется около 3 минут.

//             DBCursor cursor = mongoCollection.find(query);
//

//             while(cursor.hasNext()){

//                 BasicDBObject Update = new BasicDBObject("$set", new BasicDBObject("email.isConfirmed", true));

//                 mongoCollection.update(cursor.next(), Update);
//             }

Этот метод занимает около 3 минут. Может кто-нибудь предложить мне обходной путь или что-то?

Ответы [ 2 ]

0 голосов
/ 16 мая 2011

Если вы использовали IDE (например, Eclipse), скачайте также источник драйвера mongo java.Установите точку останова на

mongoCollection.findAndModify (запрос, обновление);Зайдите в драйвер java, на самом деле вы можете найти строку cmd, которая отправляется в Монго.также фактический результат от Монго БД, который должен дать вам больше информации.Также вы можете скопировать / вставить строку cmd и поместить ее в оболочку mongo, и посмотреть, что будет дальше.

У меня возникла проблема с методом findAndModify, поскольку, как я уже сказал, я обнаружил, что неправильно использовал COLLECTION_NAMEв моем коде.

Я использую Mongo v1.8 и Java-драйвер v2.5.3, этот метод работает для меня.

0 голосов
/ 03 февраля 2011

У вас есть индекс на email.email? Если нет, запрос должен выполнить полное сканирование коллекции, чтобы найти правильный документ каждый раз, когда вы вызываете update.

Вы также можете на некоторое время запустить mongostat, чтобы увидеть, что еще происходит, что может вызвать замедление. mongostat -h объяснит, что означают все поля.

...