2017-05-18 2 views
0

다음은 특정 색상에 대해 사용 가능한 모든 크기가 포함 된 TShirts의 샘플 데이터입니다.

{ 
    _id: '591c0e588834491a10a584ef', 
    prdctName: 'TShirt', 
    ColorRed: [38, 40, 42, 44, 46, 48], 
    ColorPink: [38, 40, 42, 44, 46, 48],  
    ColorOrange: [38, 40, 42, 44, 46, 48] 
} 

내가 지정한 크기로 몇개의 TShirts를 가지고 있는지 계산하고 싶습니다. 예를 들어, 다양한 색상으로 '38'크기의 TShirts를 사용할 수 있습니다.

감사합니다.

+0

귀하는 실제로 많은 사람들에게 계속해서 기부하지 않습니다. 예를 들어, 몇 개의 티셔츠가 현재 샘플에 있어야합니까? 주어진 크기의 색상을 선택할 수있는 "3"이 있습니까? 컬렉션의 모든 문서에 일관된 색상이 있습니까? 가능한 모든 컬러 키의 이름을 알고 있습니까? 이 데이터 형식을 사용하거나 최선의 방법으로 구조화 할 수있는 옵션을 찾으십니까? 이것들은 명확하고 원하는 결과를 얻기 위해 질문에서 부족한 모든 것입니다. 일이 필요해. –

+0

'ColorRed', 'ColorPink', 'ColorOrange'라는 필드로 표현되는 세 가지 색상이 있습니다. 각 색상 필드 (예 : ColorPink)는 38, 40, 42, 44, 46, 46의 크기를 포함 할 수도 있고 포함하지 않을 수도 있습니다. 따라서 현재 예에서 총 TShirt 수는 3 개 * 6 크기 = 18 TShirts입니다. 구조를 수정할 수있는 범위가 없습니다. – ravik

답변

0

기본적으로 제품별로 필터링 한 다음 모든 크기를 풀고 선택한 크기에 대한 개수를 찾아야합니다. 내 마음에 오는 첫 번째 검색어는 다음과 같습니다.

db.getCollection('products').aggregate([ 
    { $match: {prdctName:"TShirt"}}, 
    { $project: { prdctName:"$prdctName", allColors: { $concatArrays: [ "$ColorRed", "$ColorPink", "$ColorOrange" ] }} }, 
    { $unwind: "$allColors"}, 
    { $match: { allColors: 38 }}, 
    { $group: { _id: "$prdctName", count:{$sum:1}}}, 
]) 

P.S. 그것은 최적의 것이 아닐 수도 있지만, 시작해야 할 것이 있습니다.

0

I는 단순히 $sum 나머지 어레이의 $size 정합 소자에 감소하고 $concatArrays$filter 사용하고 볼 수있는 가장 효율적인 그것을 효율적 두 단계 공정하게

db.collection.aggregate([ 
    // Only match potential documents 
    { "$match": { 
    "prdctName": "TShirt", 
    "$or": [ 
     { "ColorRed": 38 }, 
     { "ColorPink": 38 }, 
     { "ColorOrange": 38 } 
    ] 
    }}, 
    // Group and count the matching elements from the combined arrays 
    { "$group": { 
    "_id": "$prdctName", 
    "count": { 
     "$sum": { 
     "$size": { 
      "$filter": { 
      "in": { "$concatArrays": [ "$ColorRed", "$ColorOrange", "$ColorPink" ] }, 
      "as": "el", 
      "cond": { "$eq": [ "$$el", 38 ] } 
      } 
     } 
    } 
    }} 

]) 

을 가능한 일치하는 문서를 필터링 한 다음 단일 패스에서 누적을 수행합니다.

관련 문제