0

我有一个具有以下架构的集合:

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

我想对一个 customerId 的所有订单的“金额”进行平均,我可以通过customerId使用 avg on amount 分组来使用聚合来做到这一点。

现在,我希望输出“amount”字段不仅是“amount”的平均值,而且是“otherPayers”字段的“amount”字段的平均值。

我看过 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 回答