2016-08-13 4 views
2

필드가 존재하지 않는 한 해당 필드로 그룹화하려는 문서 모음이 있습니다. 그런 다음 두 번째 필드로 그룹화하려고합니다. 예를 들어

다음 4 문서를 고려해

{ 
    prop1: 'anything', 
    prop2: 1 
}, 
{ 
    prop1: 'anything', 
    prop2: 2 
}, 
{ 
    prop1: 'something' 
}, 
{ 
    prop1: 'something else' 
} 

나는 그룹 'prop2'에 의해 내가 3 개 분류 결과를 얻을 때. 하나 :

prop2 == 1과

prop2의 == 2

prop2 ==

정의하지만 4 개 결과를 얻을 싶어요.

prop2 == 1과

prop2의 == 2

prop1 == ''나

prop1 == '뭔가 다른'

: 한 가지

이것도 가능합니까? 매우 복잡한 쿼리입니까? 누락 된 필드를 채우는 것이 나을 수있어 그룹화 할 수 있습니까? 각 문서 내용

db.cullection.aggregate(
    { $project: { "groupVal": { $ifNull: [ '$prop2', '$prop1' ] } } }, 
    { $group: { "_id": "$groupVal" } } 
); 

다음과 같이

답변

2

$group 단계에서 $ifNull 조건부 집계 연산자를 사용해야합니다. 제 발현이 널 값으로 평가되는 경우, 또는 필드가없는 경우

db.coll.aggregate([ 
    { "$group": { "_id": { "$ifNull": [ "$prop1", "$prop2" ] } } } 
]) 

$ifNull 운영자는 제 식의 값을 반환한다. 그리고 그것이 당신이 여기서 원하는 것입니다.


당신은 당신의 파이프 라인에 $project 단계를 추가 할 수 있습니다하지만 중복 및 응용 프로그램의 성능 저하가 발생할 수 있습니다.

+0

이것은 정확히 내가 찾고있는 것입니다. 고맙습니다. – smdufb

2

당신은이 다음 $group 단계로 분류되어야 따른 값 groupVal 설정한다 그룹화 전에 $project 단계 $ifNull 연산자를 사용할 수있다. 따라서 prop2 필드가 정의 된 문서의 경우 prop2의 값이 선택되고 그렇지 않은 경우 prop1의 값이 선택됩니다.

+0

아마도 mongodb 및 해당 쿼리에 대한 지식이 부족하기 때문일 수 있습니다. 그러나 $ 프로젝트 단계에서 이것을 수행하면 그룹 스테이지 (예 : prop1 : {$ first : '$ prop1'} ')와 같은 누적기를 결과에'null '로 설정합니다. – smdufb

+0

예, '$ group'단 하나만있는 솔루션은 확실히 좋습니다! 나는'$ ifNull' 연산자가'$ group' 단계와'$ project' 단계에서 사용될 수 있다는 것을 알지 못했습니다. '$ project' 단계에서 [**'$$ ROOT' **] (https://docs.mongodb.com/manual/reference/aggregation-variables/#variable.ROOT) 연산자를 사용하여 전체 문서를 전달할 수 있습니다 'null' 값이없는'$ group' 단계. – tarashypka

관련 문제