2017-02-07 7 views
1

일부 데이터, 제품이 있으며 속성 값과 해당 속성의 id이 있습니다. 속성의 레이블은 동일한 컬렉션에 있지만 'type : "product"대신 type: "attribute"입니다. 나는 그것들에 가입 할 필요가있어서 나는 속성과 그것들의 가치의 레이블을 포함하는 제품을 가지고있다.

나는 아주 간단한 샘플 데이터이 그녀의 : https://gist.github.com/flowl/632243bca8f2907a672f66920ea0f793 내 집계는 다음과 같습니다

:

db.input.aggregate([ 
    { 
     $unwind: "$attributes" 
    }, 
    { 
     $lookup: { 
      from: "input", 
      localField: "attributes.id", 
      foreignField: "attributeId", 
      as: "attributeLabels" 
     } 
    }, 
    { 
     $match: { "output": { $ne: [] } } 
    }, 
    { 
     $group: { 
      _id: "$productId", 
      product: { "$first": "$$CURRENT"} 
     } 
    }, 
    { $group : { _id : "$product._id", data: { $push: "$$ROOT" } } } 
]); 
문제가

, 나는이의 출력을 포맷 할 :

{ 
    "_id" : ObjectId("5899925339db9185f13432c4"), 
    "data" : [ 
     { 
      "_id" : 111, 
      "product" : { 
       "_id" : ObjectId("5899925339db9185f13432c4"), 
       "type" : "product", 
       "productId" : 111, 
       "attributes" : { 
        "id" : 1, 
        "value" : "L" 
       }, 
       "attributeLabels" : [ 
        { 
         "_id" : ObjectId("5899927539db9185f13432cb"), 
         "type" : "attribute", 
         "attributeId" : 1, 
         "label" : "Size" 
        } 
       ] 
      } 
     } 
    ] 
} 

대상 :

{ 
    "_id" : ObjectId("5899925339db9185f13432c4"), 
    "type" : "product", 
    "productId" : 111, 
    "attributes" : [ 
     { 
      "_id" : ObjectId("5899927539db9185f13432cb"), 
      "type" : "attribute", 
      "attributeId" : 1, 
      "label" : "Size", 
      "value" : "L" 
     } 
    ] 
} 
+0

당신의 몽고 DB를 버전은 무엇입니까? – Veeram

+0

@Veeram db.version() - 3.4.2 – DanFromGermany

답변

1

다음 집계를 사용할 수 있습니다.

이 값은 attributes 배열의 id 필드 값을 $lookUp 값으로 바꿉니다.

응답은 정확히 비슷하지 않지만 product의 모든 특성 값을 포함합니다.

db.input.aggregate([{ 
    $unwind: "$attributes" 
}, { 
    $lookup: { 
     from: "input", 
     localField: "attributes.id", 
     foreignField: "attributeId", 
     as: "attributes.id" 
    } 
}, { 
    $match: { 
     "attributes.id": { 
      $ne: [] 
     } 
    } 
}, { 
    $unwind: "$attributes.id" 
}, { 
    $group: { 
     _id: "$_id", 
     type: { 
      "$first": "$type" 
     }, 
     productId: { 
      "$first": "$productId" 
     }, 
     attributes: { 
      "$push": "$attributes" 
     } 
    } 
}]); 

샘플 응답

{ 
    "_id": ObjectId("5899925339db9185f13432c4"), 
    "type": "product", 
    "productId": 111, 
    "attributes": [{ 
     "id": { 
      "_id": ObjectId("5899927539db9185f13432cb"), 
      "type": "attribute", 
      "attributeId": 1, 
      "label": "Size" 
     }, 
     "value": "L" 
    }] 
} 
+0

이것은 훌륭하지만 문제가 하나 있습니다. 새로운 속성 배열은 병합되는 대신 원래의 속성 배열을 대체합니다. 평균, 속성의'value' 필드가 없어집니다. – DanFromGermany

+0

답변이 업데이트되었습니다. – Veeram

+0

''$ first ': "$$ CURRENT"로 시작하는 첫 번째 $ 그룹은 내 속성 배열을 모두 대신 하나의 요소로 만 만듭니다 (제품 111에는 2 개의 속성이 있습니다). 어떻게 해결할 수 있습니까? – DanFromGermany