问题
db.orders (only small excerpt)
{ "_id" : "20101200221", "order_date" : ISODate("2010-12-12T13:11:15Z"), "net_revenue" : 19.36, "customer_id" : "aaa@gmx.net" }
{ "_id" : "20111003701", "order_date" : ISODate("2011-10-12T08:40:55Z"), "net_revenue" : 15.13, "customer_id" : "aaa@gmx.net" }
{ "_id" : "20111204977", "order_date" : ISODate("2011-12-07T09:13:47Z"), "net_revenue" : 15.13, "customer_id" : "aaa@gmx.net" }
{ "_id" : "20120206778", "order_date" : ISODate("2012-02-04T09:46:35Z"), "net_revenue" : 15.13, "customer_id" : "aaa@gmx.net" }
{ "_id" : "20120408856", "order_date" : ISODate("2012-04-15T10:37:55Z"), "net_revenue" : 12.65, "customer_id" : "aaa@gmx.net" }
{ "_id" : "20101200001", "order_date" : ISODate("2010-12-07T17:40:54Z"), "net_revenue" : 26.34, "customer_id" : "bbb@web.de" }
{ "_id" : "20100100473", "order_date" : ISODate("2011-01-31T06:38:03Z"), "net_revenue" : 34.34, "customer_id" : "bbb@web.de" }
{ "_id" : "20110601857", "order_date" : ISODate("2011-06-14T08:40:39Z"), "net_revenue" : 16.13, "customer_id" : "bbb@web.de" }
{ "_id" : "20111003719", "order_date" : ISODate("2011-10-13T06:43:50Z"), "net_revenue" : 60.75, "customer_id" : "bbb@web.de" }
{ "_id" : "20120912597", "order_date" : ISODate("2012-09-20T09:16:08Z"), "net_revenue" : 38.6, "customer_id" : "bbb@web.de" }
{ "_id" : "20130101745", "order_date" : ISODate("2013-01-28T11:40:17Z"), "net_revenue" : 20.14, "customer_id" : "bbb@web.de" }
{ "_id" : "20140615910", "order_date" : ISODate("2014-06-10T14:55:11Z"), "net_revenue" : 32.45, "customer_id" : "bbb@web.de" }`
to create a churn/revenue graph i need to group orders by month of their initial/first order per customer. in the excerpt you can see both initial orders were done 12/2010 so all the following orders should fall into this group, lets call it 1, group 2 would be everyone who had his initial order 01/2011 etc. every group will be its own graph and will be stacked like this:

the orders in the groups also have to be grouped again into months and the revenue has to be summed. i hope i could make it clear what i am trying to achieve! it's all day i am trying to figure out a way how to produce the data for the graph. Any help is appreciated!
回答1:
If I understand correctly you want the revenue by customer and by month.
The $group operator in an aggregate query is exactly what you're looking for here.
db.orders.aggregate([
{ $group : {
_id: {
customer_id: "$customer_id",
month: {$month: "$order_date"}
},
revenue: {$sum: "$net_revenue"}
}
}], ... );
With the above query, a customer will appear more than once if they order on separate months. I didn't understand if that is what you wanted or not. If instead you're wanting the total value for ALL orders from that customer, but sorted also by the FIRST time they ever ordered, do this instead:
db.orders.aggregate([
{ $sort: { order_date : 1 } }, //order by date so that $first is correct
{ $group : {
_id: {
customer_id: "$customer_id",
},
month: { $first: {$month: "$order_date"} }
revenue: {$sum: "$net_revenue"}
}
}], ... );
来源:https://stackoverflow.com/questions/27021561/group-mongodb-collection-by-month-and-aggregate-revenue-for-churn-revenue-chart