$max OR $sort+$first
max 를 구하는데, 그 때의 어떤 field 값을 구하고 싶을 때
max 순으로 정렬하고, $first 를 이용해서 첫번째 값을 가져오면 된다. 이 때 $first 가 $max 값과 같을 것이다.
여기서 핵심은
$max대신에
$sort + $first를 사용한다는 것이다.
db.status.aggregate(
{$match:{ product_id : 2, s_id : { "$ne" : 0}, datetime : { "$gte" : "201402110000" , "$lte" : "201402112355"} }},
{$group:{
_id : {ss_id :"$s_id", domain_seq : "$domain_seq",
path_id : "$path_id", datetime : "$datetime"},
bytes : {$sum : "$bytes"}
}},
{$sort : { bytes: -1 } },
{$group:{
_id : {sss_id :"$_id.ss_id", domain_seq : "$_id.domain_seq",
path_id : "$_id.path_id"},
bytes : {$max : "$bytes"},
datetime : { $first : "$_id.datetime"}
}},
{$sort : { bytes: -1 } },
{$limit:10}
);
group _id 에 $cond 사용 예제
code 가 7 인 녀석을 code 가 8 인 녀석과 합쳐서 계산하고, 나머지 code 는 각자 sum 을 계산하게 된다.db.colll.aggregate(
{ "$match" : { "id" : 3 , "domain" : 175 , "path" : 215, "datetime" : { "$gte" : "201411010100" , "$lte" : "201411010259"}}}
,{ "$group" : { "_id" : { "datetime" : "$datetime" , "code" : {$cond: [{$eq:["$code", 7]}, 8, "$code"]}} , "count" : { "$sum" : "$count"}}}
,{ "$sort" : { "_id.datetime" : 1}}
)
댓글 없음:
댓글 쓰기