【问题标题】:Modifying field with regex in Mongo and adding it to a new field在 Mongo 中使用正则表达式修改字段并将其添加到新字段
【发布时间】: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

标签: regex mongodb


【解决方案1】:

想出了一个解决方法...

通过简单地编写修改输入 url 的脚本以创建其自身的各种版本,我能够在索引数据库上运行多个查询并将结果连接起来。哈克但它奏效了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2011-04-13
    • 1970-01-01
    • 2022-10-25
    • 2015-02-25
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多