蒙戈/ Java的findAndReplace不工作

问题描述:

我有一个蒙戈集合这样蒙戈/ Java的findAndReplace不工作

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分钟。有人可以提出我的解决方法或什么?

+0

你的`for`循环将永远不会执行,因为`size`总是0. – pingw33n 2011-02-03 20:38:43

+0

哦,我的错误。 clientEmails是一个全局数组,在使用这个数组之前用另一种方法填充。 ;-) – user601878 2011-02-04 08:36:30

你有关于email.email的索引吗?如果没有,则每次调用更新时,查询都必须执行完整的集合扫描才能找到正确的文档。

你也可能想运行mongostat一段时间,看看还有哪些事情可能会导致放缓。 mongostat -h将解释所有字段的含义。

如果您使用的IDE(如Eclipse)下载mongo java驱动程序源码。在

设置断点

mongoCollection.findAndModify(query,Update); 步入java驱动程序,实际上你可以发现excatlly cmd字符串发送给mongo。也是mongo db的实际结果,应该给你更多的信息。您也可以复制/粘贴cmd字符串并放入mongo shell,然后查看接下来会发生什么。

我遇到了findAndModify方法的一个问题,正如我所说的那样,我发现我在代码中使用了错误的'COLLECTION_NAME'。

我使用mongo v1.8和java驱动程序v2.5.3,这种方法适用于我。