2017-12-23 30 views
0

私は、異なる文書値の合計の$ avgを行うことができるかどうかを知りたいと思います。マイドキュメントの構造は以下の通りです:3による「reg.hi」、「REG:私は乗算する必要がある各文書のMongoDB集約:累積値の平均は可能ですか?

{ 
    "_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 
    } 
} 

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 } 

そして、これは、コレクション内の3つのサンプル文書です。 「mid」を2、「reg.low」を1で割ったものです。その後、3つの結果を合計して平均を求めます。

これは集約クエリで実行できるかどうかわかりませんが、私は成功していない多くの方法で試しました。

これは少なくとも、結果として有効な数字を投げ捨てたものです($ 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クール、アドバイスありがとう。私はすでに3つのサンプル文書を追加しました!ありがとう –

答えて

1

まあ、単に$addFieldsを使用します。

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

あなたは間違ってペアリング演算子を持っています。オペランド式のリストを取る$sum variantを使用してください。各オペランドはドキュメントです。

この

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