替换字符串中的一个单词

6

我有一些 MongoDB 的文档,其中有一个字段如下:

Image : http://static14.com/p/Inc.5-Black-Sandals-5131-2713231-7-zoom.jpg

我该如何将字符串值中的zoom部分替换为其他文本,以便得到:

Image : http://static14.com/p/Inc.5-Black-Sandals-5131-2713231-7-product2.jpg
3个回答

8
你可以使用mongo的forEach()游标方法,通过$set操作符进行原子更新:
db.collection.find({}).snapshot().forEach(function(doc) {
    var updated_url = doc.Image.replace('zoom', 'product2');
    db.collection.update(
        {"_id": doc._id}, 
        { "$set": { "Image": updated_url } }
    );
});

如果您需要更新一个非常庞大的集合,可以使用bulkWrite来加快速度,并将更新操作重构为批量发送:

var ops = [];
db.collection.find({}).snapshot().forEach(function(doc) {
    ops.push({
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": { "$set": { "Image": doc.Image.replace('zoom', 'product2') } }
        }
    });

    if ( ops.length === 500 ) {
        db.collection.bulkWrite(ops);
        ops = [];
    }
})

if ( ops.length > 0 )  
    db.collection.bulkWrite(ops);

0
db.myCollection.update({image: 'http://static14.com/p/Inc.5-Black-Sandals-5131-2713231-7-zoom.jpg'}, {$set: {image : 'http://static14.com/p/Inc.5-Black-Sandals-5131-2713231-7-product2.jpg'}})

如果您需要对多个文档进行多次操作,则需要使用函数进行迭代。请参见此处:MongoDB:使用来自同一文档的数据更新文档

你的解决方案不可能实现,因为有超过70000个条目。 - Sameer Shaikh
就像我的答案所示,这些任务足够复杂,你不会想手动完成它们。但问题并没有指定需要更改多少个文档。 - Abby

0

现今,

  • Mongo 4.2 开始,db.collection.updateMany(别名为 db.collection.update)可以接受聚合管道,最终允许根据其自身值更新字段。
  • Mongo 4.4 开始,新的聚合运算符 $replaceOne 使得替换字符串的一部分变得非常容易。
// { "Image" : "http://static14.com/p/Inc.5-Black-Sandals-5131-2713231-7-zoom.jpg" }
// { "Image" : "http://static14.com/p/Inc.5-Black-Sandals-5131-2713231-7-boom.jpg" }
db.collection.updateMany(
  { "Image": { $regex: /zoom/ } },
  [{
    $set: { "Image": {
      $replaceOne: { input: "$Image", find: "zoom", replacement: "product2" }
    }}
  }]
)
// { "Image" : "http://static14.com/p/Inc.5-Black-Sandals-5131-2713231-7-product2.jpg" }
// { "Image" : "http://static14.com/p/Inc.5-Black-Sandals-5131-2713231-7-boom.jpg" }
  • 第一部分 ({ "Image": { $regex: /zoom/ } }) 只是为了通过过滤包含 "zoom" 的文档来加快查询速度。
  • 第二部分 ($set: { "Image": {...) 是更新聚合管道(注意方括号表示使用聚合管道):
    • $set 是一个新的聚合操作符(Mongo 4.2),在这种情况下替换字段的值。
    • 新值是使用新的 $replaceOne 操作符计算的。请注意,Image 根据其自身值 ($Image) 直接进行修改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接