스마트 사옥을 건설하기 위해 각 층별 온도 데이터를 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>