2011-02-03 8 views
0

を働いていない私は、このモンゴ/ JavaのfindAndReplaceは

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

ようMongoのコレクションを持って、私は明らかにユニークである電子メールに応じて、trueまたはfalseにisConfirmedフィールドを更新しようとしているとき、それは年齢を取ります。

私が使用しているプログラミング言語はJavaです

ここに私のコードです。でもfindAndModifyがまったく動作しません

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

この1つは

//mongoCollection.findAndModify(query, Update); 

]周りの3500エントリで構成コレクションを実行するために年齢を取る、私はここで何かが欠けていた場合、私はわからない

しかし、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

+0

私の間違いです。 clientEmailsはグローバル配列で、ここで使用される前に別のメソッドで埋められています。 ;-) – user601878

答えて

0

email.emailにインデックスがありますか?そうでない場合は、更新を呼び出すたびにクエリが完全なコレクションスキャンを実行して正しいドキュメントを見つける必要があります。

また、mongostatをしばらく実行して、減速の原因となっている可能性のあるその他の状況を確認することもできます。 mongostat -hは、すべてのフィールドの意味を説明します。

+0

あなたの返事をありがとう。 mongostatはどのように使用しますか? mongostatと入力すると、ターミナルやmongoターミナルでその種のコマンドを見つけることができませんでした。電子メールでインデックスを作成して同じクエリを実行しようとしましたが、実行に3分30秒かかります。このコレクションには36,000件のメールが含まれており、そのうちのclientEmailsにはフィルタリング後に約3700件のメールが保存されます。どのようにfindAndmodifyを動作させるか考えていますか? – user601878

+0

mongostatはmongoシェル関数ではなく、コマンドラインツールです。ヘルプを表示するために実行するコマンドは実際には 'mongostat --help'です。-hは実際に接続するホストを提供します。 –

+0

findAndModifyは、使用している方法でうまくいくはずです。 –

0

IDEを使用している場合(Eclipseのような)、mongo javaドライバソースもダウンロードしてください。ブレークポイントを設定するには

mongoCollection.findAndModify(query、Update); javaドライバに入ると、実際にはexcatlly cmd stringがmongoに送信されます。 mongo dbからの実際の結果でも、より多くの情報が得られるはずです。また、cmdの文字列をコピー/ペーストしてmongoシェルに入れ、次に何が起こるかを見ることができます。

トラブルシューティングでfindAndModifyメソッドで問題が発生しました。私が言ったように、自分のコードで「COLLECTION_NAME」が間違っていたことがわかりました。

私はmongo v1.8とjava driver v2.5.3を使用していますが、この方法は私には役に立ちます。

関連する問題