2011-02-03 87 views
0

我有一個蒙戈集合這樣蒙戈/ 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

回答

0

你有關於email.email的索引嗎?如果沒有,則每次調用更新時,查詢都必須執行完整的集合掃描才能找到正確的文檔。

你也可能想運行mongostat一段時間,看看還有哪些事情可能會導致放緩。 mongostat -h將解釋所有字段的含義。

0

如果您使用的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,這種方法適用於我。