IT박스

mongodb 문서에서 부분 문자열을 바꾸는 방법

itboxs 2020. 12. 15. 08:27
반응형

mongodb 문서에서 부분 문자열을 바꾸는 방법


다음과 같은 형식의 모음에 mongodb 문서가 많이 있습니다.

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

나는 대체 할 helloWorldt함께 helloWorld얻을 수 있습니다 :

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

내 컬렉션의 모든 문서에 대해 어떻게이 작업을 수행 할 수 있습니까?


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

현재는 필드 값을 사용하여 업데이트 할 수 없습니다. 따라서 문서를 반복하고 함수를 사용하여 각 문서를 업데이트해야합니다. 여기에 어떻게 할 수 있는지에 대한 예가 있습니다. MongoDB : 동일한 문서의 데이터를 사용하여 문서 업데이트


시작 Mongo 4.2, db.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/" } }은 업데이트 할 문서 (hello world의 철자가 틀린 문서)를 필터링하는 일치 쿼리입니다.

  • 두 번째 부분 [{ $set: { URL: ... } }]은 업데이트 집계 파이프 라인입니다 (집계 파이프 라인의 사용을 나타내는 대괄호 참조). $set이 경우 필드를 생성 / 교체하는 새로운 집계 연산자입니다. 새로운 값은 적절한 문자열 연산자 조합 $concat$split부족으로 이상하게 계산됩니다 $replace. URL자체 값 ( $URL)을 기반으로 직접 수정되는 방법 유의하십시오 .

  • 잊지 마세요 { multi: true }. 그렇지 않으면 일치하는 첫 번째 문서 만 업데이트됩니다.


nodejs. npm에서 mongodb 패키지 사용

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

문서에서 모든 부분 문자열 을 바꾸려면 다음을 사용하십시오.

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

The formatting of my comment to the selected answer (@Naveed's answer) has got scrambled - so adding this as an answer. All credit goes to Naveed.

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

Just awesome. My case was - I have a field which is an array - so I had to add an extra loop.

My query is:

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

Now you can do it!

We can use Mongo script to manipulate data on the fly. It works for me!

I use this script to correct my address data.

Example of current address: "No.12, FIFTH AVENUE,".

I want to remove the last redundant comma, the expected new address ""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);

  }
}

Hope this helps!


Just in case if you are using examples from the answers here and get "Updated 0 existing records" when running your replace script, check whether your client is connected to the primary MongoDB node that allows you to store/write changes.


Using mongodump,bsondump and mongoimport.

Sometimes the mongodb collections can get little complex with nested arrays/objects etc where it would be relatively difficult to build loops around them. My work around is kinda raw but works in most scenarios regardless of complexity of the collection.

1. Export The collection using mongodump into .bson

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

2. Convert .bson into .json format using bsondump

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

3. Replace the strings in the .json file with sed(for linux terminal) or with any other tools

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

4. Import back the .json collection with mongoimport with --drop tag where it would remove the collection before importing

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

Alternatively you can use --uri for connections in both mongoimport and mongodump

example

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/

ReferenceURL : https://stackoverflow.com/questions/12589792/how-to-replace-substring-in-mongodb-document

반응형