2017-12-28 40 views
0

컬렉션의 모든 속성에 대해 집계 파이프 라인 연산자를 적용해야하는 시나리오가 있습니다. 여기에 내가 어떻게 그것을 달성했습니다.mongodb에서 전체 컬렉션에 대한 집계 파이프 라인 연산자를 적용하는 방법

model = { 
     age: Number , 
     risk: Number, 
     retireage: Number, 
     wealth: Number 
    }; 

평균을 구해야합니다.

내가 무슨 짓을 :

$group :{ 
      _id: '', 
      age : {$avg : {$sum: ['$age',value]}}, 
      risk : {$avg : {$sum: ['$risk',value]}}, 
      retireage : {$avg : {$sum: ['$retireage',value]}}, 
      wealth : {$avg : {$sum: ['$wealth',value]}}, 

    } 

내가 컬렉션의 모든 특성에 대해 한 번에 {$avg: {$sum:'$this'}}을 적용 할 수있는 방법이있다.

+0

은 평균 할 필요가있는 모든 속성을 알지 못하는 문제입니까? 아니면 단지 그들 중 많은 수가 있고 당신은 각각 비슷한 것처럼 보이기를 원하지 않습니까? –

+0

왜 $ sum과 $ avg가 필요합니까? 단일 숫자의 평균을 취하는 것은 그 숫자 일뿐입니다. 그래서 당신이 계산하려고하는 것을 영어로 설명 할 수 있습니까? –

+0

두 번째 메모에 대한 답변을 편집했습니다. 첫 번째 코멘트는 - 예, 모든 속성을 알고 있지만 속성이 20 개 이상이므로 결과를 얻기 위해 20 줄을 쓰고 싶지는 않습니다. 또한 $ trunc을 수행해야합니다. $ trunc가 $ group 내부에서 지원되지 않기 때문에 $ project 안에 또 다른 20 줄을 써야합니다. 그래서 각각의 속성에 별도로 적용되는 문을 작성하는 방법이 있는지 궁금합니다. –

답변

1

당신은 모든 문서의 값을 축적 한 후 각 필드의 합 얻을 $sum 연산자를 사용하는 null_id 값을 지정할 필요가 : 당신이 그룹에 여러 필드가있는 경우

Model.aggregate([ 
    { 
     $group : 
     { 
      _id: null, 
      age: { $avg: { $sum: '$age' } }, 
      risk: { $avg: { $sum: '$risk' } }, 
      retireage: { $avg: { $sum: '$retireage' } }, 
      wealth: { $avg: { $sum: '$wealth' } } 
     } 
    } 
]); 

편집 당신 루프를 사용하여 쿼리를 만들 수 있습니다.

var fields = ['age', 'risk', 'retireage', 'wealth', ...]; 
    groups = { _id: null }; 

fields.foreach(function (field) { 
    groups[field] = { $avg: { $sum: '$' + field } }; 
}); 

Model.aggregate([ 
    { 
     $group : groups 
    } 
]); 
+0

결과는 다음과 같이해야한다 { _id : avegAge, 위험 : avgRisk, retireage : avgRetireage, 재산 : avgWealth, 는, 시대 ''} 각 속성에 대한 평균 얻을 필요가 –

+0

필요성이'{ 을 _id : '빈 문자열' ': avegAge, 위험 : avgRisk, retireage : avgRetireage, 부, 나이 avgWealth, 을}'내 대답을 업데이트 –

+0

이와 나는 결과를 가지고 살펴 – YouneL