0

次のスキーマを持つコレクションがあります。

{OrderId : id, CustomerId : id, amount: Number, otherPayers : [{name : String, amount : Number}]}

customerId のすべての注文の「金額」の平均を作成したいと思いますcustomerId。平均金額でグループ化することにより、集計でそれを行うことができます。

ここで、出力「金額」フィールドを「金額」の平均だけでなく、「otherPayers」フィールドの「金額」フィールドの平均にしたいと考えています。

mapreduce を調べましたが、機能しません。

何か案が?SQL では、サブクエリを使用すると非常に簡単になります。

4

1 に答える 1

0

otherPayers 配列内のすべての金額に加えて、ドキュメントの最上位レベルの金額フィールドを平均したいと思います。集約フレームワークでそれを行う方法は次のとおりです。

unwind = { $unwind : "$otherPayers" };
group =  { $ group : { _id : "$CustomerId", 
                       amt : { $first : "$amount" }, 
                       count : { $sum : 1 }, 
                       total : { $sum : "$otherPayers.amount" }
         } };
project = { $project : { _id : 0, 
                         CustomerId : "$_id", 
                         avgPaid : { $divide : [ 
                                       { $add : [ "$total", "$amt" ] },  
                                       { $add : [ "$count", 1 ] } 
                         ] } 
} };

db.collection.aggregate(unwind, group, project);
于 2013-04-25T07:42:49.873 に答える