所以我有一个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
有可能吗?
答案 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.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
)直接对其进行修改。