2017-12-23 5 views
0

다른 문서 값의 합계를 $ avg로 할 수 있는지 알고 싶습니다.MongoDB aggregation : 가능한 값의 평균값?

time: { type: Number, required: true }, 
    date: { type: Date, required: true }, 
    reg: { 
     hi: { type: Number, default: 0 }, 
     mid: { type: Number, default: 0 }, 
     low: { type: Number, default: 0 }, 
     null: { type: Number, default: 0 } 
    }, 
    area: { type: mongoose.Schema.Types.ObjectId, ref: 'Area', required: true } 

을 그리고이 컬렉션의 세 가지 예를 들어 문서입니다 : "reg.hi을"3 "등록 기준 : 내가 곱해야하는 각 문서에 대한

{ 
    "_id" : ObjectId("5a2c64237a651d3cc2dc2da1"), 
    "time" : 1510193369104, 
    "date" : ISODate("2017-11-09T02:09:29.104Z"), 
    "area" : ObjectId("5a236b2309391a0febfac0c9"), 
    "reg" : { 
     "hi" : 59, 
     "mid" : 35, 
     "low" : 1573, 
     "null" : 4733 
    } 
} 
{ 
    "_id" : ObjectId("5a2c64237a651d3cc2dc2da5"), 
    "time" : 1510193369104, 
    "date" : ISODate("2017-11-09T02:09:29.104Z"), 
    "area" : ObjectId("5a236b2309391a0febfac0a9"), 
    "reg" : { 
     "hi" : 0, 
     "mid" : 0, 
     "low" : 2018, 
     "null" : 4382 
    } 
} 
{ 
    "_id" : ObjectId("5a2c64247a651d3cc2dc2df4"), 
    "time" : 1510193369104, 
    "date" : ISODate("2017-11-09T02:09:29.104Z"), 
    "area" : ObjectId("5a236b2309391a0febfac11b"), 
    "reg" : { 
     "hi" : 57, 
     "mid" : 235, 
     "low" : 1909, 
     "null" : 4199 
    } 
} 

내 문서 구조는 다음과 같습니다. mid "를 2,"reg.low "를 1 씩 비교합니다. 그 후에 세 가지 결과를 합산하여 평균값을 얻습니다.

집계 쿼리에서이 작업을 수행 할 수 있는지 여부는 알 수 없지만 여러 가지 방법으로 성공을 거두었습니다.

결과로 유효한 숫자를 던진 것입니다. $ match가있는 문서를 필터링하고 있지만 걱정하지 않아야합니다.

Log.aggregate([{ 
      $group: { 
      _id: { area: "$area" }, 
      avg: { 
       $avg: { 
       $sum: { 
        $multiply: ["$reg.low", 1], 
        $multiply: ["$reg.mid", 2], 
        $multiply: ["$reg.hi", 3] 
       } 
       } 
      } 
      } 
     } 
    ]) 

미리 감사드립니다. 각 문서는 곱셈과 평균을 수행하려는 경우

+1

안녕을보십시오! 스키마를 이해하지만 3 ~ 4 개의 실제 입력 문서를 제공하십시오. 가중치 평균을 얻고 있고 (5에서 나눈 값을 뺀 값) 궤도에 올랐지 만 출력물을 찾고 있으면 만족할만한 쿼리가 있다고 확신합니다. –

+0

@BuzzMoschetti, 조언 주셔서 감사합니다. 이미 세 가지 예제 문서를 추가했습니다! 감사 –

답변

1

글쎄, 단순히 $addFields를 사용

db.foo.aggregate([ 
    {$addFields: { theAverage: {$avg: [ 
     {$multiply: ["$reg.low", 1]} 
    ,{$multiply: ["$reg.mid", 2]} 
    ,{$multiply: ["$reg.hi", 3]} 
         ]} 
    }} 
]); 
1

당신은 운영자가 잘못 짝을했다. 피연산자 표현식 목록을 취하는 $sum 변형을 사용하십시오. 각 피연산자는 문서입니다.

Log.aggregate([{"$group":{ 
    "_id":{"area":"$area"}, 
    "avg":{ 
    "$avg":{ 
     "$sum":[ 
     {"$multiply":["$reg.low",1]}, 
     {"$multiply":["$reg.mid",2]}, 
     {"$multiply":["$reg.hi",3]} 
     ] 
    } 
    } 
}}]) 
관련 문제