我是一个 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})
这将创建一个新的索引,只要我在查询它们之前正确修改了 url,就可以更快地查询。
但是,我很害怕在 100gb 的记录中运行 for 循环。有没有更好的方法来做到这一点,我没有想到?