如何在mongodb文档中替换子字符串

8 浏览
0 Comments

如何在mongodb文档中替换子字符串

我有一个集合中的许多MongoDB文档,格式如下:

{

....

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

.....

}

我想要将helloWorldt替换为helloWorld,得到:

{

....

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

.....

}

如何对集合中的所有文档都实现这个目标?

0
0 Comments

在使用MongoDB时,有时候需要替换文档中的子字符串。下面是一种解决方法:

1. 使用mongodump命令将集合导出为.bson文件:

mongodump --db= --collection= --out=data/

2. 使用bsondump命令将.bson文件转换为.json格式:

bsondump --outFile products.json data//products.bson

3. 使用sed命令(或其他工具)替换.json文件中的字符串:

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

4. 使用mongoimport命令将.json文件导入回集合中,并使用--drop参数在导入之前删除集合:

mongoimport --db= --drop --collection products 

另外,你也可以在mongoimport和mongodump命令中使用--uri参数进行连接。

例如:

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

这是一个非常聪明的解决方法,非常适合操作员使用!感谢分享!

0
0 Comments

如何在MongoDB文档中替换子字符串

现如今,

自Mongo 4.2起,db.collection.updateMany(别名为db.collection.update)可以接受聚合管道,最终允许根据其自身值更新字段。

自Mongo 4.4起,新的聚合操作符$replaceOne使得替换字符串的一部分变得非常容易。

// { URL: "www.abc.com/helloWorldt/..." }
// { URL: "www.abc.com/HelloWo/..." }
db.collection.updateMany(
  { URL: { $regex: /helloWorldt/ } },
  [{
    $set: { URL: {
      $replaceOne: { input: "$URL", find: "helloWorldt", replacement: "helloWorld" }
    }}
  }]
)
// { URL: "www.abc.com/helloWorld/..." }
// { URL: "www.abc.com/HelloWo/..." }

第一部分({ URL: { $regex: /helloWorldt/ } })是匹配查询,用于过滤要更新的文档(包含"helloWorldt"的文档),只是为了加快查询速度。

第二部分($set: { URL: {...)是更新聚合管道(请注意方括号表示使用聚合管道):

- $set是一个新的聚合操作符(Mongo 4.2),在这种情况下替换字段的值。

- 新值是使用新的$replaceOne操作符计算的。请注意,URL是根据其自身值($URL)直接修改的。

在Mongo 4.4之前(从Mongo 4.2开始),由于缺乏适当的字符串$replace操作符,我们必须使用一种不完美的$concat和$split的组合:

db.collection.updateMany(
  { URL: { $regex: "/helloWorldt/" } },
  [{
    $set: { URL: {
      $concat: [
        { $arrayElemAt: [ { $split: [ "$URL", "/helloWorldt/" ] }, 0 ] },
        "/helloWorld/",
        { $arrayElemAt: [ { $split: [ "$URL", "/helloWorldt/" ] }, 1 ] }
      ]
    }}
  }]
)

如果你在find中使用正则表达式,可以吗?

感谢Xavier的出色解释!

如果你遇到"the update operation document must contain atomic operators"的错误,你可能需要更新Mongo。我以为我们已经是最新版本了,但实际上我们使用的是3.2版本。

0
0 Comments

如何在MongoDB文档中替换子串

在MongoDB中,有时我们需要对文档中的特定字段进行子串替换操作。下面的代码展示了如何使用JavaScript进行这样的替换操作:

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

这段代码的功能是查找所有`mediaContainer`字段为"ContainerS3"的文档,并对其中的`url`字段进行子串替换操作。具体来说,将`url`字段中的"//a.n.com"替换为"//b.n.com"。然后,使用`db.media.save(e)`保存更新后的文档。

这段代码的工作原理是,通过`db.media.find()`查询符合条件的文档,并使用`forEach`循环遍历每个文档。在循环中,我们将`url`字段中的子串进行替换,并将更新后的文档保存回数据库。

然而,上述代码只适用于字段为单个值的情况。如果字段是一个数组,需要使用额外的循环来处理。下面是一个例子:

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));
});

在这个例子中,我们查询`profile`集合中`photos`字段不为空的文档,并使用两层循环进行替换操作。首先,我们遍历每个文档,然后再遍历`photos`数组中的每个元素。对于每个元素,我们将其中的子串进行替换,并将更新后的值赋回原来的位置。最后,使用`db.getCollection("profile").save(e)`保存更新后的文档。

需要注意的是,变量`e`表示每个文档的副本,我们在副本上进行操作并保存回数据库,从而覆盖原来的文档。此外,代码中的变量`i`是不必要的,可以删除。

有用户提出,是否可以只更新发生改变的字段,而不是读取整个文档并写回数据库。这种方法可以提升性能,但需要使用特定的方法进行更新,而不是使用JavaScript。这可能需要使用MongoDB的更新操作符,如`$set`和`$unset`来更新指定字段。

总结起来,上述代码展示了如何在MongoDB文档中进行子串替换操作。通过遍历文档并在每个字段上进行替换,我们可以实现所需的更新。然而,如果需要优化性能,可以考虑使用MongoDB的更新操作符来只更新发生改变的字段。

0