[MongoDB] Modeling 7.BucketPattern

기훈·2024년 4월 7일

MongoDB

목록 보기
10/28

스마트 사옥에서 각 층별로 온도에 대한 데이터를 수집하여 MongoDB에 저장한다

  • 반복문과 날짜를 조합하여 1분단위의 30일치분 테스트 데이터를 삽입한다.


    (데이터는 864000개 이고, 데이터의 총 크기는 약 60MB이다)

문제점

  • 컬렉션의 도큐먼트수가 너무 많다. (온도 외에 습도나 대기환경등에 데이터를 추가하게 되면 더 많아지게 된다)
  • 도큐먼트 수가 많아지면 인덱스의 수도 증가한다

개선하기

  • BucketPattern: document 가 너무 많아질 때 group화 하여 저장

/**
 * 버켓패턴
 * 데이터를 잘라서 저장함 -> 여기서는 한시간을 기준으로 데이터를 나누어 저장
 * 데이터가 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  

0개의 댓글