我有一些 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
我有一些 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
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);
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'}})
现今,
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
) 直接进行修改。