在Mongodb中搜索和替换

Search and replace in Mongodb?

本文关键字:替换 搜索 Mongodb      更新时间:2023-09-26

给定100篇文章,每篇文章都有一个带有文章内容的body属性并且在该内容中有像"http://example.com/wp-content/uploads/5.jpg"这样的图像url

是否有一种方法可以浏览每个帖子的正文内容,然后寻找与"http://example.com/wp-content/uploads/5.jpg"匹配的内容,并将其替换为"http://amazon-bucket.aws.com/wp-content/uploads/5.jpg"之类的内容

谢谢!

不完全是,我的意思是,如果你不是在寻找"确切的字符串",并希望总是替换为"相同的"不同的字符串。

从本质上看,你正在寻找一个"正则表达式替换"的文档,可以通过.update()执行。虽然 $regex 搜索是可能的,但没有"捕获"或选项将捕获的部分提供给语句的"更新"部分,例如 $set

为了进行这种更新,你需要循环你的文档并在代码中修改。但是批量操作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个文档才将更新发送到服务器一次。

虽然不推荐,但我认为这是mongodb服务器端JavaScript功能的罕见用例之一,如果您经常需要的话。

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