有人問道
In SQL:SELECT SUM(price) FROM ordersIn Mongo:db.users.aggregate([ { $group: {_id:null, total:{$sum:"$price"} } }])In SQL:SELECT SUM(price)FROM ordersHAVING SUM(price)>10 In Mongo:?
MapReduce可以實現,但是不值得。因為代碼寫起來太過繁瑣。
其實我們可以在Aggregation Framework中稍微變換一下$match和$group的順序。
db.t4.insert({"_id":1,"name":"apple","price":10})db.t4.insert({"_id":2,"name":"boy","price":5})db.t4.insert({"_id":3,"name":"apple","price":20})db.t4.insert({"_id":4,"name":"apple","price":30})db.t4.insert({"_id":5,"name":"cup","price":10})db.t4.insert({"_id":6,"name":"cup","price":20})db.t4.insert({"_id":7,"name":"dark","price":10})db.t4.insert({"_id":8,"name":"dark","price":10})db.t4.insert({"_id":9,"name":"egg","price":10})db.t4.insert({"_id":0,"name":"film","price":10})db.t4.aggregate([ { $group: {_id:"$name", total:{$sum:"$price"} }}, { $match:{"total":{"$gt":10}}}])
當然我也測試過傳統的$group,在finalize中做處理。可是問題是,finalize函數操作的對象為數組內部元素本身,將其刪除後並不會改變結果集的大小。
My Code是這樣的:
db.t4.group( { key: { "name":true} , reduce: function(obj,prev) { prev.psum += obj.price; } , initial: { psum: 0 } , finalize: function(out){ if(out.psum <= 10) return null;} });