在Mongodb中搜索和替换?

时间:2014-08-08 01:27:49

标签: javascript mongodb mongodb-query

给定一组100个帖子,每个帖子都有一个带帖子内容的body属性,并且在该内容中有图片网址,如“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

谢谢!

2 个答案:

答案 0 :(得分:2)

不完全如此,我的意思是,如果你不是在寻找“确切的字符串”,并且想要总是用“相同”的不同字符串替换。

基本上,您似乎正在为可以通过.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个文档处理后,更新才会发送到服务器。

答案 1 :(得分:2)

虽然不推荐,但我认为这是MongoDBs server side JavaScript feature有效的常见用例之一,以防您经常需要。

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