1

我正在尝试遍历特定集合中的所有文档并更新文档(基于文档中已有的信息)。我开始使用 pymongo 在 python 中执行此操作,但它似乎需要永远,所以我决定将它移动到 db 盒并在 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());
}
4

1 回答 1

1

我的猜测是前 500 个对象适合某个缓存,因此它们会在内存中更新并稍后写入磁盘。但是在 500 次写入操作后缓存已满,因此后续写入必须等到之前的更改已写入磁盘。

您的代码从数据库中读取整个文档,对其进行一些更改,然后将整个文档发送回数据库。这意味着需要覆盖整个文档。这并不奇怪,这很慢。

您应该在更新命令中使用$set 运算符来仅更新那些实际更改的字段。

当您设法更新数据库上的文档而不将它们读入您的应用程序时,在性能方面会更好。你没有写出你对这些文件做了什么以及在什么条件下。当它不是那么复杂时,这可能是可能的。

于 2012-10-05T13:39:19.577 回答