如何替换mongodb文件中的子字符串

时间:2012-09-25 19:29:14

标签: mongodb mongodb-.net-driver mongo-shell

我在形式的集合ABC中有很多mongodb文档:

{
....
"URL":"www.abc.com/helloWorldt/..."
.....
}

我想用helloWorld替换helloWorldt 最终产出:

{
....
"URL":"www.abc.com/helloWorld/..."
.....
}

如何为集合ABC中的所有文档实现此目的

11 个答案:

答案 0 :(得分:92)

db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
    e.url=e.url.replace("//a.n.com","//b.n.com");
    db.media.save(e);
});

答案 1 :(得分:8)

目前,您无法使用字段的值来更新它。因此,您必须遍历文档并使用函数更新每个文档。有一个例子说明你可以在这里做到这一点:MongoDB: Updating documents using data from the same document

答案 2 :(得分:5)

的NodeJS。使用mongodb package from npm

db.collection('ABC').find({url: /helloWorldt/}).toArray((err, docs) => {
  docs.forEach(doc => {
    let URL = doc.URL.replace('helloWorldt', 'helloWorld');
    db.collection('ABC').updateOne({_id: doc._id}, {URL});
  });
});

答案 3 :(得分:5)

要替换文档中出现的 ALL 个子字符串,请使用:

db.media.find({mediaContainer:"ContainerS3"}).forEach(function(e,i) {
var find = "//a.n.com";
var re = new RegExp(find, 'g');
e.url=e.url.replace(re,"//b.n.com");
db.media.save(e);
});

答案 4 :(得分:2)

我对所选答案(@ Naveed的答案)的评论格式已经被打乱 - 所以添加这个作为答案。归功于Naveed。

----------------------------------------------- -----------------------

太棒了。 我的情况是 - 我有一个数组的字段 - 所以我不得不添加一个额外的循环。

我的查询是:

db.getCollection("profile").find({"photos": {$ne: "" }}).forEach(function(e,i) {
    e.photos.forEach(function(url, j) {
        url = url.replace("http://a.com", "https://dev.a.com");
        e.photos[j] = url;
    });
    db.getCollection("profile").save(e);
    eval(printjson(e));
})

答案 5 :(得分:1)

现在你可以做到!

我们可以使用Mongo脚本动态处理数据。它对我有用!

我使用此脚本来更正我的地址数据。

当前地址示例:" No.12,FIFTH AVENUE,"。

我想删除最后一个多余的逗号,即预期的新地址"" No.12,FIFTH AVENUE"。

var cursor = db.myCollection.find().limit(100);

while (cursor.hasNext()) {
  var currentDocument = cursor.next();

  var address = currentDocument['address'];
  var lastPosition = address.length - 1;

  var lastChar = address.charAt(lastPosition);

  if (lastChar == ",") {

    var newAddress = address.slice(0, lastPosition);


    currentDocument['address'] = newAddress;

    db.localbizs.update({_id: currentDocument._id}, currentDocument);

  }
}

希望这有帮助!

答案 6 :(得分:1)

使用mongodump,bsondump和mongoimport。

有时候,使用嵌套数组/对象等,mongodb集合可能变得不太复杂,因为在它们周围构建循环相对困难。我的工作还很原始,但是不管集合的复杂性如何,它都能在大多数情况下工作。

1。使用mongodump将集合导出到.bson

mongodump --db=<db_name> --collection=<products> --out=data/

2。使用bsondump将.bson转换为.json格式

bsondump --outFile products.json data/<db_name>/products.bson

3。用sed(对于Linux终端)或任何其他工具替换.json文件中的字符串

sed -i 's/oldstring/newstring/g' products.json

4。使用带有--drop标签的mongoimport导入.json集合,在导入之前它将删除集合。

mongoimport --db=<db_name>  --drop --collection products <products.json
  

或者,您也可以在两个mongoimport中使用--uri进行连接   和mongodump

示例

mongodump --uri "mongodb://mongoadmin:mystrongpassword@10.148.0.7:27017,10.148.0.8:27017,10.148.0.9:27017/my-dbs?replicaSet=rs0&authSource=admin" --collection=products --out=data/

答案 7 :(得分:1)

Mongo 4.2db.collection.update()开始可以接受聚合管道,最终允许基于另一个字段来更新一个字段:

// { URL: "www.abc.com/helloWorldt/..." }
// { URL: "www.abc.com/HelloWo/..." }
db.collection.update(
  { URL: { $regex: "/helloWorldt/" } },
  [{
    $set: { URL: {
      $concat: [
        { $arrayElemAt: [ { $split: [ "$URL", "/helloWorldt/" ] }, 0 ] },
        "/helloWorld/",
        { $arrayElemAt: [ { $split: [ "$URL", "/helloWorldt/" ] }, 1 ] }
      ]
    }}
  }],
  { multi: true }
)
// { URL: "www.abc.com/helloWorld/..." }
// { URL: "www.abc.com/HelloWo/..." }

这有点冗长,因为还没有合适的字符串$replace运算符。

  • 第一部分{ URL: { $regex: "/helloWorldt/" } }是匹配查询,用于过滤要更新的文档(打招呼世界的文档拼写错误)。

  • 第二部分[{ $set: { URL: ... } }]是更新聚合管道(请注意方括号表示使用聚合管道)。 $set是新的聚合运算符,在这种情况下,它会创建/替换字段。由于缺少适当的字符串$concat运算符,因此使用$split$replace的混合变量来计算新值。注意如何URL根据其自身的值($URL)直接进行修改。

  • 不要忘记{ multi: true },否则只会更新第一个匹配的文档。

答案 8 :(得分:0)

如果您使用的是答案中的示例并获得&#34;更新了0现有记录&#34;运行替换脚本时,请检查您的客户端是否连接到允许您存储/写入更改的主MongoDB节点。

答案 9 :(得分:0)

这可以通过在方法import ballerina/io; public function main() { var x = 5; io:println(typeof x); } 的第一部分中使用Regex来完成,它将替换[[如果正则表达式模式中的replace都为]字符串和第二个字符串,这与Javascript中的正则表达式相同,例如:

g

由于正则表达式将替换字符串,现在我们可以通过使用方法const string = "www.abc.com/helloWorldt/..."; console.log(string); var pattern = new RegExp(/helloWorldt/) replacedString = string.replace(pattern, "helloWorld"); console.log(replacedString);查找并迭代每个元素并在forEach循环中逐一保存,轻松地实现MongoDB shell的操作,如下所示:

forEach

答案 10 :(得分:0)

如果您要搜索一个子字符串,然后将其替换为另一个,您可以尝试如下操作

    db.collection.find({ "fieldName": /.*stringToBeReplaced.*/ }).forEach(function(e, i){
        if (e.fieldName.indexOf('stringToBeReplaced') > -1) {
          e.content = e.content.replace('stringToBeReplaced', 'newString');
          db.collection.update({ "_id": e._id }, { '$set': { 'fieldName': e.fieldName} }, false, true);
        }
    })