Mongodb替换字符串中的单词

时间:2015-04-25 07:52:25

标签: mongodb mongodb-query

所以我有一个mongodb文档,其中有一个像这样的字段

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-product2.jpg

有可能吗?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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: Updating documents using data from the same document

答案 2 :(得分:0)

现在,

  • 开始Mongo 4.2db.collection.updateManydb.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)直接对其进行修改。