【发布时间】:2013-04-25 23:56:41
【问题描述】:
我是一个 mongo 菜鸟,我希望这是一个非常简单的问题。我昨天收到了一个 100gb 的 .bson 文件,需要快速检索一些与 url 相关的文档。不幸的是,管理数据库的人决定在其生命周期中更改用于存储 url 的架构。这意味着 url 字段必须通过正则表达式进行查询,并且不能被索引。
我希望做的是:正则表达式在两个版本的 url 之间取出一些公共字符串,并将其存储在一个名为 url_id 的新字段中。然后可以对该字段进行索引以进行更快的查询。浏览一些过去的 SO 帖子,我拼凑了一些可能会起作用的伪代码:
//pseudo code, i dont know javascript that well.
db.eval(function() {
db.foo.find({}, {url:1}).forEach(function(e) {
match = e.url.match(/.*(domain.com/.*)?(\\?.*)/); //remove http, www, and query strings
e.url_id = matches[1];
db.foo.save(e);
});
});
然后我可以运行:
db.foo.ensureIndex({url_id:1})
只要我在查询之前正确修改了网址,就会创建一个查询速度更快的新索引。
但是,我害怕在 100gb 的记录上运行 for 循环。有没有我没有想到的更好的方法来做到这一点?
【问题讨论】:
-
如果每个文档都可能需要修改,我看不出如何避免扫描每个文档(并可选择更新)。这需要一段时间。 :)
-
rails 有一个 find_in_batches 的概念,它以适合内存的块的形式抓取记录。如果您找不到大规模更新的方法,那么也许可以寻找一种方法来分批处理几千行文件。 api.rubyonrails.org/classes/ActiveRecord/Batches.html