ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MongoDB Time Series Collection - 2
    mongoDB 2022. 3. 25. 19:15

    MongoDB Time Series Collection - 1 :: 개발 일상 일지 (tistory.com) 에 이어서 작성하도록 하겠다.

    How to Create?

     mongoDB에서 time-series collection을 사용하는 방법은 매우 간단하다. createCollection command를 사용할 때 timeseries field 즉, time에 대응하는 data field만 설정하면 된다.


    Create Collection

    - 검색 기록을 위해 searchHistory라는 timeseries collection을 생성한다.

    db.createCollection("searchHistory", {
      timeseries: {
        timeField: "ts",
      },
    });

    여기서 설정하는 "ts"라는 이름의 field는 반드시 Date Type이어야한다.


    Options (metaField, granularity, expireAfterSeconds)

    - MetaField

     createCollection 시 optional parameter인 metaField를 추가한다.

    db.createCollection("searchHistory", {
      timeseries: {
        timeField: "ts",
        metaField: "source",
      }});

     여기서 "source" 라는 이름의 field는 metaField로 설정된다. metaField는 nested fields가 있는 document, Object 심지어 단일 GUID 혹은 string 값을 가지리 수 있다. 이는 최적화를 위해 사용하는데 secondary indexes를 생성할 수 있다. 아래와 같이 생성하여 사용해보겠다.

    "source" : {type: "user", uid: 1, name: "zzihyeon", image:"http://storage/image.png"}

    ※metaField는 timeseries source를 식별할 고유의 레이블, 테그 역할을 하기 때문에 값이 (거의) 변경되어선 안된다.

     

    - 언제 MetaField를 사용하는가

     대부분의 경우 metaField를 사용하는 편이 더 좋지만 특히 동일한 측정을 공유하는 센서 device 등을 사용하는 경우 특히 더 유용하다. 왜냐면 metaField가 있을 때 일정 기간 동안 공통 metaField를 사용한 값은 storage layer 상에서 이 필드의 중복을 제거하기 위해 내부적으로 그룹화하기 때문이다. 그리고 metadata fields의 순서는 상관이 없기 때문에 field의 순서가 달라도 값이 같으면 동일한 것으로 인식된다.

     

    - 주의사항

     metaField는 최상위 field 이름으로 지정되고 배열을 제외한 모든 BSON 데이터 유형을 지정할 수 있다. 하지만 timeField와 이름이 같아서는 안된다.


    - Granularity

     createCollection 시 optional parameter인 granularity를 추가한다.

    db.createCollection("searchHistory", {
      timeseries: {
        timeField: "ts",
        metaField: "source",
        granularity: "minutes",
      },
    });

      granularity는 default로 "seconds"이고 "seconds", "minutes", "hours" 이 세 개의 값을 갖는다. 특정 metaField에 mapping되는 data가 어느 단위로 오느냐에 따라 설정하면 된다. 예를 들어 1시간에 한번 값이 저장되면 "hours"로 설정하면 된다. 만약 metaField를 사용하지 않는다면 모든 전체 source에 대한 수집속도(granularity)를 설정해 주어야 한다. 따라서 이러한 방식은 왠만하면 피하는게 좋다.

     적절한 값으로 metaData 수집속도(granularity)를 지정하면 용도에 맞게 최적화 할 수 있다.


    - ExpireAfterSeconds

     createCollection 시 optional parameter인 expireAfterSeconds를 추가한다.

    db.createCollection("searchHistory", {
      timeseries: {
        timeField: "ts",
        metaField: "source",
        granularity: "minutes"
      },
        expireAfterSeconds: 9000 
    });

     Time Series Data는 종종 빈도수는 매우 높지만 구지 오래 유지해야 할 필요가 없는 정보를 저장할 때가 많다.

     예를 들어서 내가 주식단타를 하기 위해서 종목 별로 장이 열리는 동안 매수/매도에 대한 정보 한달치를 보고 결정한다고 하자, 그러면 데이터는 계속 쌓이지만 한달이 지난 데이터는 더 이상 필요가 없다. 이럴 때 지정할 수 있다.

     TTL index( mongoDB에서 특정 데이터의 만료 시점을 field값 변경으로 설정하는 index )처럼 자동으로 data lifecycle을 설정한다. 이는 background에서 자동으로 old data를 삭제한다. 하지만 기존 collection의 경우 TTL index를 create해줘야 하지만 time-series collection에서는 필요하지 않다.

     

    'mongoDB' 카테고리의 다른 글

    Mongodb - database and collection  (0) 2022.03.27
    MongoDB Time Series Collection - 3  (0) 2022.03.25
    MongoDB Time Series Collection - 1  (0) 2022.03.25
    MongoDB란  (2) 2022.03.24
    Nodejs에서 mongoDB, mongoose Version Upgrade  (0) 2022.03.09

    댓글

Designed by Tistory.