给定一组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”
谢谢!
答案 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函数。