복붙노트

[MONGODB] 어레이 MongoDB의 형태 변화

MONGODB

어레이 MongoDB의 형태 변화

나는 문자열의 MongoDB에있는 필드가 있습니다. { "필드": "일부 텍스트"}, 나는 배열로 모두 변환 할. { "필드": [ "텍스트"]}

나는 모든 문서를 통해 단지 루프, 다음 업데이트 필드를 얻을 수 있습니다 알고 있지만 깨끗한 방법이 있는지 궁금하네요.

감사.

해결법

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

    1.당신은지도의 감소 함수에서 그것을 할 수 / MongoDB를 모든 처리를 계속 줄일 수 있습니다. 기본적으로 당신은 새 컬렉션에 결과를 넣어 줄 /지도를 사용합니다 그리고 당신은 이전 컬렉션에 다시 복사 할 수 있습니다 (또는 이전을 삭제하고 새 이름을 변경). 이 몽고의 내부에 모든 것을 유지하는 장점이있다.

    당신은지도의 감소 함수에서 그것을 할 수 / MongoDB를 모든 처리를 계속 줄일 수 있습니다. 기본적으로 당신은 새 컬렉션에 결과를 넣어 줄 /지도를 사용합니다 그리고 당신은 이전 컬렉션에 다시 복사 할 수 있습니다 (또는 이전을 삭제하고 새 이름을 변경). 이 몽고의 내부에 모든 것을 유지하는 장점이있다.

    업데이트 :이 위해 db.eval 사용하는 또 다른 방법이 될 수 있습니다. 업데이트 때문에 서버 db.eval이 실행은 트래픽 / 대기 시간없이 서버에서 수행 될 것이다.

    난 당신이 설명하는 유일한 다른 옵션을 생각 - 쿼리하고 각 하나를 업데이트하여 클라이언트에서 그것을 할.

  2. ==============================

    2.니틴 Garg를의 대답은 위의 거의 해시, NOT 배열에 문자열에 문자열에서 자신의 예를 들어 변환을 제외하고 작동합니다.

    니틴 Garg를의 대답은 위의 거의 해시, NOT 배열에 문자열에 문자열에서 자신의 예를 들어 변환을 제외하고 작동합니다.

    계정 조엘 해리스의 의견에가는 것은, 적절한 솔루션과 같을 것이다 :

    db.jobs.find( { "jobLocationCity" : { $type : 2 } } ).snapshot().forEach( function (x) {
        x.jobLocationCity = [ jobLocationCity ];
        db.jobs.save(x);
    });
    

    또는 db.eval 사용하는 경우 :

    function f() {
        db.jobs.find( { "jobLocationCity" : { $type : 2 } } ).snapshot().forEach( function (x) {
            x.jobLocationCity = [ jobLocationCity ];
            db.jobs.save(x);
        });
    }
    db.eval(f);
    
  3. ==============================

    3.사실, 찾기 ({ "jobLocationCity는": {$ 유형 : 2}})가 제대로 작동하지 않습니다, 당신이 업데이트 스크립트를 다음 번에 실행하겠습니다 경우는 치료 때문에 문자열 형식으로 다시 요소 [ 'mystring에']를.

    사실, 찾기 ({ "jobLocationCity는": {$ 유형 : 2}})가 제대로 작동하지 않습니다, 당신이 업데이트 스크립트를 다음 번에 실행하겠습니다 경우는 치료 때문에 문자열 형식으로 다시 요소 [ 'mystring에']를.

    이 그것을 방지하기 위해 같은 당신이 뭔가를 사용해야합니다 :

    db.message_info.find( { "jobLocationCity" : { $type : 2 } }  ).snapshot().forEach(
      function (x) {
        if (!Array.isArray(x.jobLocationCity)){
            x.jobLocationCity = [ x.jobLocationCity  ];
            db.jobs.save(x);
        }
      }
    )
    

    http://docs.mongodb.org/manual/reference/operators/ 참조

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

    4.대신에 이것을 시도

    대신에 이것을 시도

    이렇게하여 MongoDB에 배열 문자열 필드의 종류를 변경하는 것

    db.jobs.find( { "jobLocationCity" : { $type : 2 } } ).forEach( function (x) {
        x.jobLocationCity = {"Location":x.jobLocationCity};
        db.jobs.save(x);
    });
    

    $ 유형의 링크를 참조  가능한 값

  5. ==============================

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

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

    // { field: "some text" }
    db.collection.update(
      {},
      [{ $set: { field: { ["$field"] } } }],
      { multi: true }
    )
    // { field: [ "some text" ] }
    
  6. ==============================

    6.짧은 대답은 no입니다.

    짧은 대답은 no입니다.

    MongoDB를 어떤 단일 작업을하거나 "변경 유형을"수행 할 명령을하지 않습니다.

    이 작업을 수행하는 가장 빠른 방법은 드라이버 중 하나를 사용하고 변경을 할 가능성이있다. 당신은 쉘을 사용하고 루프를 쓸 수 있지만 원시 속도의 측면에서, 다른 드라이버가 빨리 될 수 있습니다.

    언급 한 것으로, 프로세스의 가장 느린 부분은 디스크에 데이터를 다시 세척 한 후 변경할 수 메모리로 디스크에서 모든 데이터를로드 할 것입니다. 이 마법의 "변경 유형"명령 사실도 될 것이다.

  7. from https://stackoverflow.com/questions/7401394/mongodb-type-change-to-array by cc-by-sa and MIT license