복붙노트

[MONGODB] MongoDB의 문서에서 하위 문자열 대체하는 방법

MONGODB

MongoDB의 문서에서 하위 문자열 대체하는 방법

나는 형식의 컬렉션 MongoDB의 문서를 많이 가지고 :

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

내가 얻을 인 helloWorld와 helloWorldt를 교체하려면 :

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

어떻게 내 컬렉션에있는 모든 문서 이것을 달성 할 수 있습니까?

해결법

  1. ==============================

    1.

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

    2.몽고 4.2 시작, db.collection.update ()는 마지막으로 다른 필드를 기준으로 필드의 업데이트를 허용 집계 파이프 라인을 받아 들일 수 있습니다 :

    몽고 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/..." }
    

    이것은 조금 아직 연산자를 대체 할 적절한 문자열 $ 없기 때문에 장황.

  3. ==============================

    3.현재, 당신은 그것을 업데이트 할 필드의 값을 사용할 수 없습니다. 그래서 당신은 문서를 통해 반복해야하고 기능을 사용하여 각 문서를 업데이트 할 수 있습니다. 당신이 그렇게 할 수있는 방법에 대한 예제가있다 : MongoDB를 : 같은 문서에서 데이터를 사용하여 업데이트 문서

    현재, 당신은 그것을 업데이트 할 필드의 값을 사용할 수 없습니다. 그래서 당신은 문서를 통해 반복해야하고 기능을 사용하여 각 문서를 업데이트 할 수 있습니다. 당신이 그렇게 할 수있는 방법에 대한 예제가있다 : MongoDB를 : 같은 문서에서 데이터를 사용하여 업데이트 문서

  4. ==============================

    4.nodejs. NPM에서 MongoDB의 패키지를 사용하여

    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});
      });
    });
    
  5. ==============================

    5.문서에 사용되는 문자열의 모든 발생을 교체하려면 :

    문서에 사용되는 문자열의 모든 발생을 교체하려면 :

    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);
    });
    
  6. ==============================

    6.(Naveed의 대답 @) 선택한 답변에 대한 나의 의견의 서식이 스크램블있어 한 - 그래서 대답으로이 추가. 모든 신용 Naveed로 이동합니다.

    (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));
    })
    
  7. ==============================

    7.지금 당신은 그것을 할 수 있습니다!

    지금 당신은 그것을 할 수 있습니다!

    우리는 실시간으로 데이터를 조작 할 몽고 스크립트를 사용할 수 있습니다. 그것은 나를 위해 작동합니다!

    내 주소 데이터를 수정하기 위해이 스크립트를 사용합니다.

    현재 주소의 예 : "12 번 5 번가,".

    나는 마지막 중복 쉼표, 예상되는 새 주소 ","12 번 5 번가 "를 제거합니다.

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

    희망이 도움이!

  8. ==============================

    8.그냥 당신이 대답을 여기에서 예를 사용하고 있고 대체 스크립트를 실행할 때 "0 기존 레코드를 업데이트"받을 경우 경우, 클라이언트가 저장 / 쓰기 변경을 허용하는 주 MongoDB를 노드에 연결되어 있는지 확인합니다.

    그냥 당신이 대답을 여기에서 예를 사용하고 있고 대체 스크립트를 실행할 때 "0 기존 레코드를 업데이트"받을 경우 경우, 클라이언트가 저장 / 쓰기 변경을 허용하는 주 MongoDB를 노드에 연결되어 있는지 확인합니다.

  9. ==============================

    9.때로는 MongoDB의 컬렉션이 중첩 된 배열을 조금 복잡한 얻을 수 / 등 그들 주변의 빌드 루프 상대적으로 어려울 것입니다 경우 객체. 나의 해결책은 좀 원시하지만 수집의 복잡성에 관계없이 대부분의 시나리오에서 작동합니다.

    때로는 MongoDB의 컬렉션이 중첩 된 배열을 조금 복잡한 얻을 수 / 등 그들 주변의 빌드 루프 상대적으로 어려울 것입니다 경우 객체. 나의 해결책은 좀 원시하지만 수집의 복잡성에 관계없이 대부분의 시나리오에서 작동합니다.

    .bson에 mongodump를 사용하여 1. 내보내 모음

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

    .json 형식으로 2. 변환 .bson bsondump를 사용하여

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

    (리눅스 터미널) 나오지도 또는 다른 도구로 .json 파일에서 문자열을 교체합니다

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

    4. 가져 오기는 가져 오기 전에 컬렉션을 제거 할 --drop 태그 mongoimport으로 .json 모음을 백업

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

    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/
    
  10. from https://stackoverflow.com/questions/12589792/how-to-replace-substring-in-mongodb-document by cc-by-sa and MIT license