2017-10-12 1 views
0

우편 번호를 분류하고 각 그룹의 수를 반환 할 수있는 집계 쿼리를 작성하려고합니다.배열에 값이 포함 된 경우 우편 번호를 새 범주로 그룹화하십시오.

docuement이

{ 
"_id" : ObjectId("value"), 
"updatedAt" : ISODate("value"), 
"zip" : "11209", 
"state" : "NY", 
"city" : "New York", 
} 

같은 부분에 보이는 내가 이상적으로 뭔가를 반환 상호 배타적 값

east_ny_zipcodes = [11209, 11210, 11211, ...] 
lower_ny_zipcodes = [11212, 11213, 11214, ...] 

의 N 번호 배열에 "우편 번호"필드를 비교하여 그룹 싶습니다

{ 
lower_ny: 1200, 
upper_ny: 1500, 
east_ny: 2000 
} 
+1

당신은'$의 cond'와'$의 그룹 '을 사용하고 자신의 콘드의 각 범주에 대한 배열을 비교할 수 있습니다 : 당신이하지 않았다면하지만 쉽게 이루어집니다. db.collection_name.aggregate'같은 뭔가 ({ "$ 그룹": { "_id": 널 (null), "east_ny": { "$ 합계": { "$ 콘드"[ { "$에서 "[ "$ 지퍼 " "east_ny_zipcodes " ] } 0] }}} })'. '$ match' 단계를'$ or'와 함께 추가하여 파이프 라인에서 처리 할 우편 번호를 제한 할 수 있습니다. – Veeram

답변

1

3.4 이후 MongoDB를 사용하면을 사용할 수 있습니다. 당신이 할 수없는 경우

db.zips.aggregate([ 
    { "$group": { 
    "_id": null, 
    "lower_ny": { 
     "$sum": { 
     "$cond": [{ "$in": [ "$zip", lower_ny_zipcodes ] },1,0] 
     } 
    }, 
    "east_ny": { 
     "$sum": { 
     "$cond": [{ "$in": [ "$zip", east_ny_zipcodes ] },1,0] 
     } 
    }, 
    "upper_ny": { 
     "$sum": { 
     "$cond": [{ "$in": [ "$zip", upper_ny_zipcodes ] },1,0] 
     } 
    } 
    }} 
]) 

다음 MongoDB를 2.6 이후 $setIsSubset가 : 23,210 배열에 대한 비교를 얻을 수 있습니다. 구문과 의도가 약간 다릅니다. 하지만 당신의 목록은 문제가되지 않습니다 그래서 "독특한"입니다 본질적으로

db.zips.aggregate([ 
    { "$group": { 
    "_id": null, 
    "lower_ny": { 
     "$sum": { 
     "$cond": [{ "$setIsSubset": [ ["$zip"], lower_ny_zipcodes ] },1,0] 
     } 
    }, 
    "east_ny": { 
     "$sum": { 
     "$cond": [{ "$setIsSubset": [ ["$zip"], east_ny_zipcodes ] },1,0] 
     } 
    }, 
    "upper_ny": { 
     "$sum": { 
     "$cond": [{ "$setIsSubset": [ ["$zip"], upper_ny_zipcodes ] },1,0] 
     } 
    } 
    }} 
]) 

그것은 작업으로 전송 BSON 내용으로 확장됩니다 당신의 외부에서 정의 된 배열 내용, 단지 논리적 비교입니다.

물론 배열의 값은 "문자열"이어야 일치 할 수 있습니다.

east_ny_zipcodes = [11209, 11210, 11211, ...].map(n => n.toString()); 
+0

각 카테고리의 수를 모두 반환 할 수 있지만 일반적인 $ eq 쿼리와 같은 그룹화 된 항목의 목록도 반환 할 수 있습니까? 현장 확인을하고 있는지 확인하십시오. 감사합니다. $ 연산자를 사용했지만 $ cond를 먼저 사용하지 않았습니다. 해명 해줘서 고마워. –

+0

@MeirSnyder 당신은 ['$ push'] (https://docs.mongodb.com/manual/reference/operator/aggregation/push/)를 찾았습니다. 그룹화 경계와 일치하는 항목 16MB 제한이 여전히 적용되므로 배열 내용이 잘못되어 그룹화 된 문서를 구성하는 경우 오류가 발생할 수 있습니다. 또는'$ in'은 단지 부울을 반환하기 때문에, 부울 값을 가진 기존의 데이터와 함께'$ project' 또는'$ addFields'를 그룹화하지 않고 항상 사용할 수 있습니다. –

관련 문제