mongodb中的aggregate() 方法詳解
阿新 • • 發佈:2018-12-19
按照 支付狀態進行分組
db.weixin_pay_log.aggregate([
{$group:{_id:"$payStatus",count:{$sum:1},total:{$sum:"$sum"}}}
])
支付型別payType = “5”
db.weixin_pay_log.aggregate([
{$match:{"payType":"5"}},
{$group:{_id:"$payStatus",count:{$sum:1},total:{$sum:"$sum"}}}
])
count總數 小於 2500
db.weixin_pay_log.aggregate([ {$group:{_id:"$payStatus",count:{$sum:1},total:{$sum:"$sum"}}}, {$match:{count:{$lt:2500}}} ])
多欄位進行分組
db.weixin_pay_log.aggregate([
{$group:{_id:{payType:"$payType",payStatus:"$payStatus"},count:{$sum:1}}},
])
$project
db.collection.aggregate([
{$project:{name:1,status:1}}
]);
結果是,只有_id,name,status三個欄位的表資料,相當於sql表示式 select _id,name,status from collection
MongoDB提供了三種執行聚合的方法:Aggregation Pipleline,map-reduce功能和 Single Purpose Aggregation Operations
aggreagte是一個數組,其中包含多個物件(命令),通過遍歷Pipleline陣列對collection中的資料進行操作。
$group
:聚合的配置
-
_id
代表你想聚合的資料的主鍵,上述資料中,你想聚合所有cust_id
相同的條目的amount
的總和,那_id
即被設定為cust_id
。_id
為必須,你可以填寫一個空值。 -
total
代表你最後想輸出的資料之一,這裡total
是每條結果中amount
的總和。 -
$sum
是一個聚合的操作符,另外的操作符你可以在官方文件中找到。上圖中的命令表示對相同主鍵(_id)下的amount
進行求和。如果你想要計算主鍵出現的次數,可以把命令寫成如下的形式{$sum: 1}
db.weixin_pay_log.aggregate([
{$group:{_id:{payType:"$payType",payStatus:"$payStatus"},
count:{$sum:1},
count_avg:{$avg:"$totalFee"},
weixinId_first:{$first:"$weixinId"},
weixinId_last:{$last:"$weixinId"},
fee_sum:{$sum:"$totalFee"}
}},
])
db.weixin_pay_log.aggregate([
{$project:{totalFee:1,weixinId:1,yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$repayRequestTime"} }}},
{$group:{_id:{date:"$yearMonthDay",payType:"$payType",payStatus:"$payStatus"},
count:{$sum:1},
count_avg:{$avg:"$totalFee"},
weixinId_first:{$first:"$weixinId"},
weixinId_last:{$last:"$weixinId"},
fee_sum:{$sum:"$totalFee"}
}},
])
-
$match
聚合前資料篩選 -
$skip
跳過聚合前資料集的 n 行, 如果{$skip: 10}
, 最後rows = 5000000 - 10
-
$project
之選擇需要的欄位, 除了_id
之外其他的欄位的值只能為 1
conversionStage = {
$project:{
from:1,
to:1,
amount:1,
timestamp:{
$convert:{
input:"$timestamp",
to:"date",
onError:{
$concat:["Could not convert",
{$toString:"$timestamp"},
" to type date."]
},
onNull:"Missing timestamp."
}
}
}
};
filterStage = {
$match:{
timestamp:{"$type","date"}
}
};
calcStage = {
$group:{
_id:{account:"$from",year:{$year:"$timestamp"},month:{$month:"$timestamp"}},
sum:{$sum:"$account"},
count:{$sum:1}
}
};
load(aggregate.js)
db.tranfer.aggregate([conversionStage,filterStage,calcStage]);