0

我有一个像这样的 Mongo 收藏

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

当我尝试将isConfirmed字段更新为真或假时,这取决于显然是唯一的电子邮件,这需要很长时间。

我使用的编程语言是 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 分钟。有人可以建议我解决方法或其他什么吗?

4

2 回答 2

0

你有关于 email.email 的索引吗?如果不是,则每次调用 update 时,查询都必须进行完整的集合扫描以找到正确的文档。

您可能还想运行 mongostat 一段时间,看看还有什么可能导致减速。mongostat -h 将解释所有字段的含义。

于 2011-02-03T18:36:30.587 回答
0

如果您使用的是 IDE(如 Eclipse),请同时下载 mongo java 驱动程序源。设置断点在

mongoCollection.findAndModify(查询,更新);进入java驱动,实际上你可以找到excatlly cmd string send to mongo。还有来自 mongo db 的实际结果,它应该为您提供更多信息。您也可以复制/粘贴 cmd 字符串并放入 mongo shell,看看接下来会发生什么。

我遇到了 findAndModify 方法的问题,按照我所说的进行故障排除,发现我在代码中使用了错误的“COLLECTION_NAME”。

我正在使用 mongo v1.8 和 java driver v2.5.3,这种方法对我有用。

于 2011-05-15T22:52:00.743 回答