2017-10-21 11 views
0

컬렉션이 있고 해당 컬렉션의 각 문서에 배열 필드 countries이 있습니다. 나는 아래 국가 중 하나를 포함하는 모든 문서를 선택합니다 :일치하는 배열 요소 수

China, USA, Australia

그리고 출력은 각 문서가 위 국가의 수를 표시해야합니다. 나는 집계 명령 아래 사용 : 예상대로

db.movies.aggregate([ 
    { 
    $match: { countries: { $in: ["USA", 'China', 'Australia'] } } 
    }, 
    { 
    $project: { 
     countries: {$size: '$countries'} 
    } 
    } 
]); 

가 작동하지 않습니다. 위에 나열된 국가의 문서에있는 모든 국가의 수를 보여줍니다. 예를 들어 countries 필드에 China, Japan이라는 문서가있는 경우 위의 국가 목록에 China 만 있기 때문에 1을 반환 할 것으로 예상했지만 2를 반환합니다. 집계 명령에서 어떻게 할 수 있습니까?

답변

2

$in 연산자는 가능한 값 중 하나를 포함하는 문서를 "쿼리"하기 만하므로 배열에서 아무 것도 제거하지 않습니다.

당신이 "만 일치"계산하려면 다음 $size 전에 배열에 $setIntersection을 적용

문서의 배열에 대해 제공되는 배열로는 "독특한"의 "설정"을 반환 일치
db.movies.aggregate([ 
    { 
    $match: { countries: { $in: ["USA", 'China', 'Australia'] } } 
    }, 
    { 
    $project: { 
     countries: { 
     $size: { 
     "$setIntersection": [["USA", 'China', 'Australia'], '$countries' ] 
     } 
    } 
    } 
]); 

.

현대 릴리스 (MongoDB 3.4 이상)에서 집계 연산자로 $in의 대체 단어가 있습니다. 이것은 값의 배열에 대해 "단수"값을 "테스트"할 때 조금 다르게 작동합니다. 배열 비교에서는 $filter에 적용됩니다 : "문서 내"배열이 고유하지 않은 항목이 포함 된 경우

db.movies.aggregate([ 
    { 
    $match: { countries: { $in: ["USA", 'China', 'Australia'] } } 
    }, 
    { 
    $project: { 
     countries: { 
     $size: { 
     $filter: { 
      input: '$countries', 
      cond: { '$in': [ '$$this', ["USA", 'China', 'Australia'] ] } 
     } 
     } 
    } 
    } 
]); 

정말 단지 당신에게 중요한되어야한다. 즉 :

{ countries: [ "USA", "Japan", "USA" ] } 

그리고 당신은이 "설정"이 큰 감사를 작동 $setIntersection

+0

의 결과 일 것이다 1 반대로, "USA"에 대한 2을 계산 할 필요가 있었다. –