1. 程式人生 > >mongodb中的aggregate() 方法詳解

mongodb中的aggregate() 方法詳解

按照 支付狀態進行分組

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]);