스마트 사옥에서 각 층별로 온도에 대한 데이터를 수집하여 MongoDB에 저장한다
반복문과 날짜를 조합하여 1분단위의 30일치분 테스트 데이터를 삽입한다.

(데이터는 864000개 이고, 데이터의 총 크기는 약 60MB이다)
문제점
개선하기
/**
* 버켓패턴
* 데이터를 잘라서 저장함 -> 여기서는 한시간을 기준으로 데이터를 나누어 저장
* 데이터가 14400로 감소
* */
{
sensor_id: 1,
start_date: ISODate('2022-01-01T00:00:00.000Z'),
end_date: ISODate('2022-01-01T01:00:00.000Z'),
measurements: [
{ timestamp: ISODate('2022-01-01T00:01:00.000Z'), temparature: 19 },
{ timestamp: ISODate('2022-01-01T00:02:00.000Z'), temparature: 24 },
{ timestamp: ISODate('2022-01-01T00:03:00.000Z'), temparature: 18 },
{ timestamp: ISODate('2022-01-01T00:04:00.000Z'), temparature: 30 },
{ timestamp: ISODate('2022-01-01T00:05:00.000Z'), temparature: 26 },
{ timestamp: ISODate('2022-01-01T00:06:00.000Z'), temparature: 30 },
{ timestamp: ISODate('2022-01-01T00:07:00.000Z'), temparature: 20 },
{ timestamp: ISODate('2022-01-01T00:08:00.000Z'), temparature: 28 },
{ timestamp: ISODate('2022-01-01T00:09:00.000Z'), temparature: 20 },
{ timestamp: ISODate('2022-01-01T00:10:00.000Z'), temparature: 24 },
{ timestamp: ISODate('2022-01-01T00:11:00.000Z'), temparature: 17 },
{ timestamp: ISODate('2022-01-01T00:12:00.000Z'), temparature: 18 },
{ timestamp: ISODate('2022-01-01T00:13:00.000Z'), temparature: 27 },
{ timestamp: ISODate('2022-01-01T00:14:00.000Z'), temparature: 24 },
{ timestamp: ISODate('2022-01-01T00:15:00.000Z'), temparature: 20 },
{ timestamp: ISODate('2022-01-01T00:16:00.000Z'), temparature: 27 },
{ timestamp: ISODate('2022-01-01T00:17:00.000Z'), temparature: 19 },
{ timestamp: ISODate('2022-01-01T00:18:00.000Z'), temparature: 18 },
{ timestamp: ISODate('2022-01-01T00:19:00.000Z'), temparature: 27 },
{ timestamp: ISODate('2022-01-01T00:20:00.000Z'), temparature: 27 },
{ timestamp: ISODate('2022-01-01T00:21:00.000Z'), temparature: 17 },
{ timestamp: ISODate('2022-01-01T00:22:00.000Z'), temparature: 20 },
{ timestamp: ISODate('2022-01-01T00:23:00.000Z'), temparature: 19 },
{ timestamp: ISODate('2022-01-01T00:24:00.000Z'), temparature: 27 },
{ timestamp: ISODate('2022-01-01T00:25:00.000Z'), temparature: 17 },
{ timestamp: ISODate('2022-01-01T00:26:00.000Z'), temparature: 24 },
{ timestamp: ISODate('2022-01-01T00:27:00.000Z'), temparature: 28 },
{ timestamp: ISODate('2022-01-01T00:28:00.000Z'), temparature: 19 },
{ timestamp: ISODate('2022-01-01T00:29:00.000Z'), temparature: 29 },
{ timestamp: ISODate('2022-01-01T00:30:00.000Z'), temparature: 29 },
{ timestamp: ISODate('2022-01-01T00:31:00.000Z'), temparature: 28 },
{ timestamp: ISODate('2022-01-01T00:32:00.000Z'), temparature: 18 },
{ timestamp: ISODate('2022-01-01T00:33:00.000Z'), temparature: 17 },
{ timestamp: ISODate('2022-01-01T00:34:00.000Z'), temparature: 19 },
{ timestamp: ISODate('2022-01-01T00:35:00.000Z'), temparature: 23 },
{ timestamp: ISODate('2022-01-01T00:36:00.000Z'), temparature: 19 },
{ timestamp: ISODate('2022-01-01T00:37:00.000Z'), temparature: 19 },
{ timestamp: ISODate('2022-01-01T00:38:00.000Z'), temparature: 26 },
{ timestamp: ISODate('2022-01-01T00:39:00.000Z'), temparature: 22 },
{ timestamp: ISODate('2022-01-01T00:40:00.000Z'), temparature: 22 },
{ timestamp: ISODate('2022-01-01T00:41:00.000Z'), temparature: 30 },
{ timestamp: ISODate('2022-01-01T00:42:00.000Z'), temparature: 22 },
{ timestamp: ISODate('2022-01-01T00:43:00.000Z'), temparature: 29 },
{ timestamp: ISODate('2022-01-01T00:44:00.000Z'), temparature: 25 },
{ timestamp: ISODate('2022-01-01T00:45:00.000Z'), temparature: 24 },
{ timestamp: ISODate('2022-01-01T00:46:00.000Z'), temparature: 28 },
{ timestamp: ISODate('2022-01-01T00:47:00.000Z'), temparature: 23 },
{ timestamp: ISODate('2022-01-01T00:48:00.000Z'), temparature: 27 },
{ timestamp: ISODate('2022-01-01T00:49:00.000Z'), temparature: 29 },
{ timestamp: ISODate('2022-01-01T00:50:00.000Z'), temparature: 25 },
{ timestamp: ISODate('2022-01-01T00:51:00.000Z'), temparature: 29 },
{ timestamp: ISODate('2022-01-01T00:52:00.000Z'), temparature: 17 },
{ timestamp: ISODate('2022-01-01T00:53:00.000Z'), temparature: 23 },
{ timestamp: ISODate('2022-01-01T00:54:00.000Z'), temparature: 29 },
{ timestamp: ISODate('2022-01-01T00:55:00.000Z'), temparature: 27 },
{ timestamp: ISODate('2022-01-01T00:56:00.000Z'), temparature: 22 },
{ timestamp: ISODate('2022-01-01T00:57:00.000Z'), temparature: 30 },
{ timestamp: ISODate('2022-01-01T00:58:00.000Z'), temparature: 23 },
{ timestamp: ISODate('2022-01-01T00:59:00.000Z'), temparature: 22 },
{ timestamp: ISODate('2022-01-01T01:00:00.000Z'), temparature: 29 }
]
}
개선하기2
도큐먼트의 수는 감소했지만 현재 모델링은 데이터 커스텀이 어렵다.
ex) 25도 이상 데이터를 30분 단위로 알고싶다면 ??
몽고디비5.0 timeseries 컬렉션을 사용하자
(시계열 데이터에 대한 효율적인 저장이 가능, 내부적으로 클러스터드 인덱스를 사용하여 빠른 속도의 검색이 가능)
db.createCollection("sensor3", {
timeseries: {
timeField: "timestamp",
metaField: "metadata", // 타임 필드 컬렉션 외에 자주사용되는 데이터에 대한 인덱스 생성을 위해 metaField가 필요하다
granularity: "minutes",
},
});
모델링별 데이터 크기 비교
db.sensor1.stats().size / 1024 / 1024; // 데이터크기: 60.150146484375
db.sensor2.stats().size / 1024 / 1024; // 데이터크기: 38.232421875
db.sensor3.stats().size / 1024 / 1024; // 24.772201538085938