https://www.mongodb.com/blog/post/building-with-patterns-the-bucket-pattern
하나의 센서에서 들어오는 여러 데이터가 쌓이는 상황이라고 가정해보자. 몽고DB에 저장되는 Document 형태는 아래와 같다.
{
sensor_id: 12345,
timestamp: ISODate("2019-01-31T10:00:00.000Z"),
temperature: 40
}
{
sensor_id: 12345,
timestamp: ISODate("2019-01-31T10:01:00.000Z"),
temperature: 40
}
{
sensor_id: 12345,
timestamp: ISODate("2019-01-31T10:02:00.000Z"),
temperature: 41
}
이런식으로 데이터를 저장했을 때 데이터와 인덱스 사이즈가 문제가 된다. 센서ID와 timestamp 에 인덱스를 걸었을 떄 중복된 데이터에 대해서 인덱스를 걸기 때문에 문제가 되는 것이다. 이런 상황에서 버킷 패턴을 적용하면 아래와 같다.
{
sensor_id: 12345,
start_date: ISODate("2019-01-31T10:00:00.000Z"),
end_date: ISODate("2019-01-31T10:59:59.000Z"),
measurements: [
{
timestamp: ISODate("2019-01-31T10:00:00.000Z"),
temperature: 40
},
{
timestamp: ISODate("2019-01-31T10:01:00.000Z"),
temperature: 40
},
…
{
timestamp: ISODate("2019-01-31T10:42:00.000Z"),
temperature: 42
}
],
transaction_count: 42,
sum_temperature: 2413
}
measurement 라는 엔트리 안에 해당 센서에서 들어온 측정값을 모두 넣어주는 것이다. 즉 measurement라는 통(버킷) 안에 모두 넣어주는 것이다. measurement 안의 측정값의 개수는 transaction_count를 이용해 정하고 데이터가 들어가거나 나갈때마다 transaction_count를 가감해주는 방식으로 구현했다. 밑에 있는 sum_temperature는 measurement에 들어있는 측정된 온도를 모두 합친 값으로 이후에 통계값으로 사용하기 위해 이런식으로 구현했다.
몯고 DB의 하나의 도큐먼트는 16MB 초과할 수 없기 때문에 시작시간과 종료시간을 설정해 구현했으며 데이터를 로깅하는 resolution에 따라서 하나의 도큐먼트에 저장할 기간을 산정하면된다.
'Technology > DB' 카테고리의 다른 글
[MongoDB] aggregate explain (0) | 2022.09.16 |
---|---|
[DB] 트랜잭션 격리 수준 (0) | 2021.07.28 |