요즘 회사에서 MongoDB를 새로 접하고 있다. 이런 형식의 query는 처음 작성해보는데, 편리한 연산자들이 많아서 쓸만한 것 같다!
날짜가 뒤죽박죽 섞여있는 mongoDB에서, 시간 간격을 두고 데이터를 어떻게 가져올 수 있을까?
db.테이블이름.aggregate([
{$group: {
_id: {
interval: {
$subtract: [
{ $year: '$DATE'},
{ $mod: [{ $year: "$DATE"}, 2]}
]
}
},
count: { $sum: 1}
}},
{$sort: { _id: 1 } }
])
interval이란 id를 두고 group을 만들면 된다. 여기서는 DATE 중 year($year
operator 사용)을 가져와서 이를 기준으로 2년 간격으로 데이터를 묶고 있다.
예를 들어서, 2014 - 2015 - 2016 - 2017 순으로 있다고 했을 때, $mod
는 1이나 0만을 return할 것이므로 $subtract
의 결과값 또한 $year - 1
이거나 $year
이 된다.
그 결과 interval은 2014 - 2014 - 2016 - 2016가 될 것이고, 이를 _id
로 사용하여 그룹을 만들면 2년 간격으로 그룹이 만들어지게 된다.
분 단위, 초 단위에서도 모두 쉽게 적용이 가능한 방법이고, 여기에 $avg
, $sum
등을 적절히 사용하면 15분 동안의 평균값 구하기 등의 응용이 가능하다.
참고 자료: https://stackoverflow.com/questions/26814427/group-result-by-15-minutes-time-interval-in-mongodb