我有一个包含以下架构的集合:
{OrderId : id, CustomerId : id, amount: Number, otherPayers : [{name : String, amount : Number}]}
我想平均计算"金额"对于customerId的所有订单,我可以通过在customerId
上以平均金额进行分组来实现汇总。
现在,我想要输出"金额"字段不仅是"金额"的平均值,而且还包括"金额" " otherPayers"字段。
我已经看过mapreduce,但我无法让它工作。
有什么想法吗?在SQL中,使用子查询会非常简单。
答案 0 :(得分: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);