복붙노트

[MONGODB] 배열 내에서 MongoDB를 이름 바꾸기 데이터베이스 필드

MONGODB

배열 내에서 MongoDB를 이름 바꾸기 데이터베이스 필드

나는이에 식별자의 이름을 변경해야합니다

{ "general" : 
  { "files" : 
    { "file" : 
      [  
        {  "version" : 
          {  "software_program" : "MonkeyPlus",      
             "indentifier" : "6.0.0" 
          } 
        } 
      ] 
    } 
  } 
}

난 노력 했어

db.nrel.component.update(
  {},
  { $rename: {
    "general.files.file.$.version.indentifier" : "general.files.file.$.version.identifier"
  } },
  false, true
)

그러나 그것은 반환 : $ 이름 바꾸기 소스가 동적 배열되지 않을 수 있습니다.

해결법

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

    1.문서에서 언급 한 바와 같이 직접 하나의 명령으로 배열 내의 필드의 이름을 바꿀 수있는 방법이 없습니다. 귀하의 유일한 옵션은, 컬렉션의 문서를 반복을 읽고 $ 해제 된 / $ 설정 새로운 작업과 각을 업데이트하는 것입니다.

    문서에서 언급 한 바와 같이 직접 하나의 명령으로 배열 내의 필드의 이름을 바꿀 수있는 방법이 없습니다. 귀하의 유일한 옵션은, 컬렉션의 문서를 반복을 읽고 $ 해제 된 / $ 설정 새로운 작업과 각을 업데이트하는 것입니다.

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

    2.무엇의 가치가해야 할 끔찍한 소리가 잠시 동안, 해결책은 아주 쉽게 사실이다. 물론 이것은 당신이 얼마나 많은 기록에 따라 달라집니다. 그러나 여기 내 예입니다 :

    무엇의 가치가해야 할 끔찍한 소리가 잠시 동안, 해결책은 아주 쉽게 사실이다. 물론 이것은 당신이 얼마나 많은 기록에 따라 달라집니다. 그러나 여기 내 예입니다 :

    db.Setting.find({ 'Value.Tiers.0.AssetsUnderManagement': { $exists: 1 } }).snapshot().forEach(function(item)
    {    
        for(i = 0; i != item.Value.Tiers.length; ++i)
        {
            item.Value.Tiers[i].Aum = item.Value.Tiers[i].AssetsUnderManagement;
            delete item.Value.Tiers[i].AssetsUnderManagement;
        }
    
        db.Setting.update({_id: item._id}, item);
    });
    

    I 배열이 발견 내 컬렉션에 걸쳐 반복 처리하고 "잘못된"이름을 찾을 수있다. 나는 다음으로 반복 하위 콜렉션, 새로운 값을 설정 이전을 삭제하고 전체 문서를 업데이트합니다. 그것은 상대적으로 고통이었다. 난 단지를 통해 검색 할 수 수십 행의 수천을 부여하는 몇 다스 충족 기준을의.

    그럼에도 불구하고,이 대답은 사람을 도움이되기를 바랍니다!

    편집 : 쿼리에 추가 된 스냅 샷 (). 왜 주석을 참조하십시오.

    MongoDB를 3.4에서 스냅 () 함수를 제거 하였다. 그래서 3.4 이상 몽고를 사용하는 경우, 위의 예는 스냅 샷 () 함수를 제거해야합니다.

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

    3.나는 비슷한 문제가 있었다. 내 상황에서 나는 다음과 같은 훨씬 쉽게 알게되었다 :

    나는 비슷한 문제가 있었다. 내 상황에서 나는 다음과 같은 훨씬 쉽게 알게되었다 :

    mongoexport --db mydb --collection modules --out modules.json
    
    mongoimport --db mydb --collection modules --drop --file modules.json
    
  4. ==============================

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

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

    // { general: { files: { file: [
    //   { version: { software_program: "MonkeyPlus", indentifier: "6.0.0" } }
    // ] } } }
    db.collection.updateMany(
      {},
      [{ $set: { "general.files.file": {
           $map: {
             input: "$general.files.file",
             as: "file",
             in: {
               version: {
                 software_program: "$$file.version.software_program",
                 identifier: "$$file.version.indentifier" // fixing the typo here
               }
             }
           }
      }}}]
    )
    // { general: { files: { file: [
    //   { version: { software_program: "MonkeyPlus", identifier: "6.0.0" } }
    // ] } } }
    

    문자 적으로이 업데이트 문서 (재) 같은 "software_program"필드가 포함 된 이름이 "식별자"필드를 포함하는 "버전"개체의 "파일"요소 매핑 $ 의한 "general.files.file"설정의 배열을 $ 무슨 일이 "indentifier"의 값으로 사용된다.

    몇 가지 추가 정보 :

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

    5.또한 배열에 속성 이름을 변경하고 싶습니다 : 나는 것을 사용

    또한 배열에 속성 이름을 변경하고 싶습니다 : 나는 것을 사용

    db.getCollection('YourCollectionName').find({}).snapshot().forEach(function(a){
        a.Array1.forEach(function(b){
            b.Array2.forEach(function(c){
                c.NewPropertyName = c.OldPropertyName;
                delete c["OldPropertyName"];                   
            });
        });
        db.getCollection('YourCollectionName').save(a)  
    });
    
  6. from https://stackoverflow.com/questions/9122966/mongodb-rename-database-field-within-array by cc-by-sa and MIT license