2017-11-03 4 views
2

mongodb 3.4를 사용하고 있습니다. 내 집계를 실행하면 내 결과가 다음과 같이 표시됩니다. 두 컬렉션간에 조인을했습니다. 집계 결과의 배열 하위 문서 이름 바꾸기

[ { 
    "_id": { // rename _id to main 
     "id": "ID_001", 
     "name": "Fred flinstone Inc" 
    }, 
    "types": [ 
     { 
     "typeId": "TYPE1", 
     "locations": [ 
      { 
      "locationName": "Sydney", // rename locationName to name 
      "units": [ 
       { 
       "unitId": "PHG_BTG1" // remove the unitId, i just want the value 
       } 
      ] 
      }, 
      { 
      "locationName": "Brisbane", 
      "units": [ 
       { 
       "unitId": "PHG_KTN1" 
       }, 
       { 
       "unitId": "PHG_KTN2" 
       } 
      ] 
      } 
     ] 
     } 
    ] } ] 

는 내가이 작업을 수행 할 수있는 방법

[ 
    { 
    "main": { 
     "id": "ID_001", 
     "name": "Fred flinstone Inc" 
    }, 
    "types": [ 
     { 
     "typeId": "TYPE1", 
     "locations": [ 
      { 
      "name": "Sydney", 
      "units": [ 
       "PHG_BTG1" 
      ] 
      }, 
      { 
      "name": "Brisbane", 
      "units": [ 
       "PHG_KTN1", 
       "PHG_KTN2" 
      ] 
      } 
     ] 
     } 
    ] 
    } 
] 

로 투사 할? $ project의 여러 조합을 시도했지만 실패했습니다. 예

{ $project: { 
    main: "$_id", 
    "_id": 0, 
    "types.locations.name": "$types.locations.locationName" 
}} 

올바르게 locations.name 이름을 변경되지만 값 [시드니 브리즈번]의 배열을 나타낸다. 위치와 비슷한 것을 시도했을 때 똑같이.

다시 풀려했지만 너무 비어있는 결과가 표시됩니다. 어떤 도움이라도 대단히 감사합니다.

답변

1

$project은 실제로 사용하려고하는 형식에서 "포괄적"또는 "배타적"만을 사용합니다. 따라서 "types": { "typeId": 1 }을 사용하여 배열의 해당 항목 만 반환 할 수는 있지만 "포함"또는 "제외"만으로는 기본 구조를 실제로 변경할 수 없습니다. 당신이 발견으로 또한

, 같은 :

{ "$project": { 
    "types.locations.units": "$types.locations.units.unitId" 
}} 

는 MongoDB를 각 값을 전망하고 있기 때문에 당신이 기대했던 것과 밖으로 다른 온다 "매핑"배열 요소로 :

"types" : [ 
    { 
     "locations" : [ 
      { 
       "units" : [ 
        [ 
         [ 
          "PHG_BTG1" 
         ], 
         [ 
          "PHG_KTN1", 
          "PHG_KTN2" 
         ] 
        ] 
       ] 
      } 

또는 악화 :

{ "$project": { 
    "types.typeId": "$types.typeId" 
}} 

로 :

"types" : [ 
    { 
     "typeId" : [ 
      "TYPE1" 
     ] 
    } 
] 

"배열 배열"은 실제로 여기에 필요하지 않습니다. 그래서 우리가 실제로 사용하고 싶은 다음 연산자를 사용하는 것이 실제로 "속기 (shorthand)"인 이유를 알 수 있습니다. 형식을 반환

{ "$project": { 
    "_id": 0, 
    "main": "$_id", 
    "types": { 
    "$map": { 
     "input": "$types", 
     "as": "t", 
     "in": { 
     "typeId": "$$t.typeId", 
     "locations": { 
      "$map": { 
      "input": "$$t.locations", 
      "as": "l", 
      "in": { 
       "name": "$$l.locationName", 
       "units": { 
       "$map": { 
        "input": "$$l.units", 
        "as": "u", 
        "in": "$$u.unitId" 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
}} 

당신이 원하는 :

$map를 사용하여 배열을 "변환"하려면

{ 
    "main" : { 
     "id" : "ID_001", 
     "name" : "Fred flinstone Inc" 
    }, 
    "types" : [ 
     { 
      "typeId" : "TYPE1", 
      "locations" : [ 
       { 
        "name" : "Sydney", 
        "units" : [ 
         "PHG_BTG1" 
        ] 
       }, 
       { 
        "name" : "Brisbane", 
        "units" : [ 
         "PHG_KTN1", 
         "PHG_KTN2" 
        ] 
       } 
      ] 
     } 
    ] 
} 

기본적으로 각 "배열이" "재 매핑"그냥 반환에 그것의 구조는 당신이 실제로 지정한 내부 표현입니다. 따라서 $map을 다른 $map 표현식 안에 중첩시켜 각 배열 요소의 내부 배열을 처리해야합니다. 우리가 있기 때문에

참고 또한 본질적으로 "다시 쓰기"를 "type" 재산, $project에 같은 이름을 가진 속성의 기본 동작은 일반적으로 "복사"로하고 "types"되는 것은 실제로 기존의 일부입니다, 순서를 유지할 것 "main"이 아닌 문서 구조. 따라서 "types"은 표준 프로젝션 포함에 의해 "첫 번째"로 표시됩니다.

"다시 쓰기"는 이것이 새로운 요소로 간주된다는 것을 의미합니다. 따라서 키 순서는 "main"이 앞에오고 그 반대의 경우가 아니라 투영법과 동일합니다.

+0

아름답게 일한다. – erickyi2006