【问题标题】:Search and replace in Mongodb?在MongoDB中搜索和替换?
【发布时间】:2017-06-27 17:16:22
【问题描述】:

给定一组 100 个帖子,每个帖子都有一个带有帖子内容的 body 属性,并且在该内容内有图像 url,例如“http://example.com/wp-content/uploads/5.jpg

有没有办法浏览每个帖子的正文内容,然后查找与“http://example.com/wp-content/uploads/5.jpg”匹配的任何内容并将其替换为“http://amazon-bucket.aws.com/wp-content/uploads/5.jpg”之类的内容

谢谢!

【问题讨论】:

    标签: javascript mongodb mongodb-query


    【解决方案1】:

    不完全是,我的意思是,如果您不是在寻找“确切的字符串”并且希望始终用“相同”的不同字符串替换。

    基本上,您似乎正在寻找可以通过.update() 执行的文档的“正则表达式替换”。虽然可以进行$regex 搜索,但没有“捕获”或将捕获的部分提供给诸如$set 等语句的“更新”部分的选项。

    因此,为了进行这种更新,您需要循环您的文档并在代码中进行修改。但是Bulk Operations API 可以在这里提供一些帮助:

    var bulk = db.collection.initializeOrderedBulkOp();
    var counter = 0;
    
    var query = { "url": { "$regex": "^http://example\.com" }};
    db.collection.find(query).forEach(function(doc) {
    
        // Inspect and replace the part of the string
        bulk.find({ "_id": doc._id }).updateOne(
            { "$set": { "url": doc.url.replace("example.com","bucket.aws.com") } }
        );
        counter++;
    
        // Update once every 1000 documents
        if ( counter % 1000 == 0 ) {
            bulk.execute();
            bulk = db.collection.initializeOrderedBulkOp();
        }
    
    })
    
    // Process any remaining
    if ( counter % 1000 != 0 )
        bulk.execute();
    

    所以这仍然需要循环,但至少每处理 1000 个文档,更新才会发送到服务器一次。

    【讨论】:

      【解决方案2】:

      虽然不建议这样做,但我认为这是对 MongoDBs server side JavaScript feature 有效的罕见用例之一,以防您经常需要。

      这样做的好处是您不必来回传输文档,而是在服务器上更改它们。而且您甚至不必实现触发逻辑,您只需使用 cronjob 和 --eval 调用您的服务器端 JS 函数。

      【讨论】:

      • 我昨天出于另一个目的查看服务器端 Javascript,文档说,“如果可能,我们不建议使用服务器端存储的函数”,仅此而已。知道为什么吗?我可以问这个问题,但如果你有一个简短的答案,那将是非常受欢迎的。
      • 它能够在服务器上创建一个未定义的负载,直到它影响服务器的核心功能,存储数据。它消耗了索引所需的 RAM。但是,我在这里看到了一个用例。谨慎行事。
      • 谢谢,有道理。
      猜你喜欢
      • 2010-12-13
      • 2015-08-18
      • 2010-10-06
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2020-07-20
      相关资源
      最近更新 更多