我试图遍历特定集合中的所有文档并更新文档(基于文档中已有的信息)。我开始在python中使用pymongo进行此操作,但它似乎需要永远,所以我决定将它移动到数据库框并在javascript中运行它,但它似乎仍然停滞不前。我只谈论政变,一千个文件。我似乎注意到的是:
启动任务,前500个对象立即更新,不久之后,接下来200个,再长一点100个,然后它开始进一步减速。
如果我从我的代码中删除更新调用,它就会很好地通过循环,所以显然我的更新似乎冻结了一些东西。
继续js我正在跑步:
mydb = db.getSisterDB(DB_NAME);
var cursor = mydb.user.find({is_registered:true}).limit(3000);
while (cursor.hasNext()) {
var u = cursor.next();
/* fix property on user doc */
mydb.user.update({ _id: u._id }, u);
print(cursor.objsLeftInBatch());
}
答案 0 :(得分:1)
我的猜测是前500个对象适合某些缓存,因此它们会在内存中更新并稍后写入磁盘。但是在500次写入操作之后,缓存已满,因此后续写入必须等到先前的更改写入磁盘。
您的代码从数据库中读取整个文档,对它们进行一些更改,然后将整个文档发送回数据库。这意味着整个文档需要被覆盖。这很慢,这并不奇迹。
您应该在更新命令中使用the $set operator来仅更新实际更改的字段。
当您设法更新数据库上的文档而不将其读入应用程序时,性能会更好。您没有写下您对文档的确切操作以及在什么条件下。当它不复杂时,这可能是可能的。