2013-11-04 2 views
3

일부 집계 쿼리를 실행하는 Mongo 데이터베이스가 있습니다. 다음은 실행할 간단한 쿼리입니다.평균값이 0인지 또는 null인지 확인하는 방법은 무엇입니까?

db.coll.aggregate([ 
{ $group: { 
    _id: 'fieldA', 
    fieldB: { $avg: '$fieldB' } 
} }, 
]) 

이 필드는 데이터를 fieldA로 그룹화하고 fieldB의 평균을 계산합니다. 어쨌든 결과 집합의 일부 행은 fieldB의 값으로 0을가집니다. 거기에 대한 2 가지 이유가 될 수 있습니다

  1. 평균 값이 fieldB을하지 않은 그룹에 0
  2. 모든 문서 (또는 값에 null를했다) 이 경우 Mongo의 동작은 0을 반환합니다.

다른 쿼리를 실행하거나 집계 파이프 라인을 떠나지 않고 결과 선택에서 각 행에 대해 어떤 시나리오가 발생했는지 확인할 수 있습니까?

UPDATE

내가 그런 내가 몇 가지 필드에 대한 집계를하고 있어요으로 null이 아닌 필드를, 필터링 할 수 없습니다

:

db.coll.aggregate([ 
{ $group: { 
    _id: 'fieldA', 
    fieldB: { $avg: '$fieldB' }, 
    fieldC: { $avg: '$fieldC' } 
} }, 
]) 

문서 중 일부는 fieldB가있을 수 있지만, fieldC가 아니라 그 반대입니다.

+0

는'$의 avg'에 포함되지 않아야 문서를 필터링 할 파이프 라인에'$의 match'를 추가합니다. – WiredPrairie

답변

2

$group 수술 전에 $match을 사용하여 데이터를 필터링 할 수 있습니다.

db.coll.aggregate([ 
{ $match: { fieldB : {$ne : null }}}}, 
{ $group: { 
    _id: 'fieldA', 
    fieldB: { $avg: '$fieldB' } 
} }, 
]) 

이렇게하면 fieldB이 설정된 문서 만 표시됩니다.

UPDATE

모든 값이 NULL$min 연산자를 사용하는 경우가 $avg 그 방법을 사용할 수 있지만, 당신이 밖으로 찾을 수 있습니다

db.coll.aggregate([ 
{ $group: { 
    _id: 'fieldA', 
    fieldB: { $avg: '$fieldB' } , 
    fieldBAllNullOrMin: { $min: '$fieldB' } 
} }, 
]) 

$min 운영자가 반환됩니다 null모든 경우 값은 null입니다. 그렇지 않으면 min을 반환합니다. 값 (그러나 MongoDB의 2.4+ 버전에서만).

+0

불행히도, 저의 경우에는 작동하지 않습니다. 동시에 평균을 계산하지 않았습니다. –

+0

어떤 버전의 mongodb를 사용하고 있습니까? 나는 2.4.6에서 $ avg 함수를 사용했지만 그 키 값이있는 문서에 대해서만 평균값을 계산합니다. http://pastebin.com/cHg9tdBY –

+1

2.4.7이 있습니다. 링크를 참조하십시오 - http://pastebin.com/9KjSETEs 여기에 'x'와 'y'필드의 평균을 계산합니다. 'x'는 올바르게 계산되지만 'y'는 입력 문서가 'y'가 전혀 없기 때문에 0을 반환합니다. 0은 완벽하게 유효한 값인 것처럼 보이지만 값이 0이거나 값이 널 (존재하지 않음)이기 때문에 0 인 경우 단일 쿼리에서 확인할 방법이 없습니다 –

2

$ max (또는 $ min) 연산자를 사용하면 $ max (또는 $ min) 연산자가 null을 반환하므로 그룹의 fieldB 인스턴스 인 이 모두 null인지 또는 누락되었는지 확인할 수 있습니다.이러한 문서와

c.aggregate([ 
    {$group: { 
     _id: '$fieldA', 
     avg: {$avg: '$fieldB'}, 
     max: {$max: '$fieldB'}, 
    }} 
]) 

:이 집계 파이프 라인을 감안할 때

c.insert({fieldA: 1, fieldB: 3}) 
c.insert({fieldA: 1, fieldB: -3}) 

결과는 다음과 같습니다

{"_id": 1, "avg": 0, "max": 3} 

이러한 문서와 반면 :

c.insert({fieldA: 1}) 
c.insert({fieldA: 1}) 

결과 전 들 :

{"_id": 1, "avg": 0, "max": null} 

최대 필드의 널 (null) 값은 fieldB 그룹에있는 모든 문서에없는 null 또는 것을 알려줍니다. 이 도움이

희망,

브루스

관련 문제