스마트 사옥을 건설하기 위해 각 층별 온도 데이터를 1분마다 센서로 수집해 MongoDB에 적재해보자
<aside> 1️⃣ 분 단위로 센서가 수집한 데이터를 하나의 도큐먼트로 저장
// DB 생성
> use IOT
// 테스트 데이터 삽입에 필요한 함수 구현
> const addMinutes = (min, date) => {
... date.setMinutes(date.getMinutes() + min)
... return new Date(date.getTime())
... }
> addMinutes(1, new Date())
ISODate("2023-05-16T15:47:46.015Z")
> const getRandomNumber = (min, max) => {
... min = Math.ceil(min);
... max = Math.floor(max);
... return Math.floor(Math.random() * (max - min + 1)) + min;
... }
> getRandomNumber(10, 30)
11
> getRandomNumber(10, 30)
28
> arr = [];
> date = new Date("2022-01-01T00:00:00.000Z");
> for (range = 0; range < 60 * 24 * 7; range++) {
... time = addMinutes(1, date);
... for (floor = 1; floor < 21; floor++) {
... arr.push({
... sensor_id: floor,
... timestamp: time,
... temparature: getRandomNumber(17, 30)
... })
... }
... }
// 총 201600건 데이터 삽입
> db.sensor1.insertMany(arr)
// 생성된 데이터 구조 확인
> db.sensor1.find()
[
{
_id: ObjectId("6463a816744ecd33df3ef320"),
sensor_id: 1,
timestamp: ISODate("2022-01-01T00:01:00.000Z"),
temparature: 20
},
{
_id: ObjectId("6463a816744ecd33df3ef321"),
sensor_id: 2,
timestamp: ISODate("2022-01-01T00:01:00.000Z"),
temparature: 23
},
...
]
// 데이터 크기 확인
> db.sensor1.stats().size / 1024 / 1024
14.0350341796875
데이터가 너무 많아지기 때문에 스토리지 용량이 위험해지고, 도큐먼트 규모가 너무 커지면 집계 연산 등을 수행할 때 CPU 사용량이 늘어남
</aside>
<aside> 2️⃣ Bucket Pattern을 사용한 모델링
<aside> ✅ Bucket Pattern
버켓에 넣어서 저장한다는 의미 특정 필드들을 기준으로 도큐먼트를 묶어 도큐먼트 수를 줄일 수 있음
</aside>
// 버킷 패턴으로 데이터 재생성
> arr = [];
> date = new Date("2022-01-01T00:00:00.000Z");
> for (hour = 0; hour < 24 * 7; hour++) {
... start_date = addMinutes(0, date)
... measurement = []
... for (sec = 0; sec < 60; sec++) {
... time = addMinutes(1, date)
... measurement.push({
... timestamp: time,
... temparature: 0
... })
... }
... for (floor = 1; floor < 21; floor++) {
... for (i = 0; i < 60; i++){
... measurement[i].temparature = getRandomNumber(17, 30)
... }
... arr.push({
... sensor_id: floor,
... start_date: start_date,
... end_date: addMinutes(0, date),
... measurements: measurement
... })
... }
... }
// 총 3360건 데이터 삽입
> db.sensor2.insertMany(arr)
// 생성된 데이터 구조 확인
> db.sensor2.find()
[
{
_id: ObjectId("6463a857744ecd33df4206b3"),
sensor_id: 20,
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: 23
},
{
timestamp: ISODate("2022-01-01T00:02:00.000Z"),
temparature: 28
},
{
timestamp: ISODate("2022-01-01T00:03:00.000Z"),
temparature: 28
},
...
]
},
...
]
// 데이터 크기 확인
> db.sensor2.stats().size / 1024 / 1024
8.9208984375
<aside> 💡 Time Series
몽고 5.0 부터 추가된 컬렉션으로, 시간을 기반으로 하는 경우에만 사용할 수 있음 시계열 데이터를 효율적으로 저장하는 컬렉션 타입 물리적으로 컬렉션을 순서대로 저장해 저장 용량도 적고, 검색 속도도 빠름
</aside>
</aside>