문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

IoT 데이터 모델링

이 페이지의 내용

  • 버킷 패턴
  • MongoDB의 시간 표현
  • 예제

사물 인터넷(IoT)은 인터넷에 연결된 물리적 객체의 네트워크입니다. 센서와 같은 많은 디바이스가 데이터를 생성합니다.

이 데이터를 효율적으로 저장하고 조회하려면 버킷 패턴을 사용하면 됩니다.

IoT 데이터를 정리하는 일반적인 방법은 데이터를 버킷으로 그룹화하는 것입니다. 버킷은 특정 데이터 그룹을 정리하여 다음과 같은 도움을 줍니다.

  • 과거 트렌드를 살펴보고,

  • 미래 트렌드를 예측하고,

  • 스토리지 사용량을 최적화하세요.

데이터를 그룹화하기 위한 일반적인 매개변수는 다음과 같습니다.

  • 시간

  • 데이터 소스(다중 데이터 집합이 있는 경우)

  • 고객

  • 데이터 유형(예: 금융 데이터의 트랜잭션 유형)

참고

MongoDB 5.0부터 time-series 컬렉션은 Time Series 데이터에 권장되는 collection 유형입니다. 버킷 패턴을 time series 컬렉션과 함께 사용하면 성능이 저하될 수 있으므로 사용하지 마세요.

센서에서 얻은 온도 데이터를 저장하는 collection을 예로 들어보겠습니다. 센서는 매분 온도를 기록하고 temperatures라는 컬렉션에 데이터를 저장합니다.

// temperatures collection
{
"_id": 1,
"sensor_id": 12345,
"timestamp": ISODate("2019-01-31T10:00:00.000Z"),
"temperature": 40
}
{
"_id": 2,
"sensor_id": 12345,
"timestamp": ISODate("2019-01-31T10:01:00.000Z"),
"temperature": 40
}
{
"_id": 3,
"sensor_id": 12345,
"timestamp": ISODate("2019-01-31T10:02:00.000Z"),
"temperature": 41
}
...

이 접근 방식은 데이터 및 인덱스 크기 측면에서 확장성이 떨어집니다. 예를 들어 애플리케이션에 sensor_idtimestamp 필드에 대한 인덱스가 필요한 경우 센서에서 수신되는 모든 판독값을 인덱싱해야 성능을 개선할 수 있습니다.

문서 모델을 활용하여 특정 기간에 대한 측정값을 보관하는 문서에 데이터를 버킷할 수 있습니다. 매분마다 읽은 값을 시간 단위 그룹으로 버킷화하는 다음과 같은 업데이트된 스키마를 고려하세요.

{
"_id": 1,
"sensor_id": 12345,
"start_date": ISODate("2019-01-31T10:00:00.000Z"),
"end_date": ISODate("2019-01-31T10:59:59.000Z"),
"measurements": [
{
"timestamp": ISODate("2019-01-31T10:00:00.000Z"),
"temperature": 40
},
{
"timestamp": ISODate("2019-01-31T10:01:00.000Z"),
"temperature": 40
},
...
{
"timestamp": ISODate("2019-01-31T10:42:00.000Z"),
"temperature": 42
}
],
"transaction_count": 42,
"sum_temperature": 1783
}

이 업데이트된 스키마는 확장성을 개선하고 애플리케이션이 실제로 데이터를 사용하는 방식을 반영합니다. 사용자는 특정 온도 수치를 쿼리하지 않을 가능성이 높습니다. 대신 사용자는 한 시간 또는 하루 동안의 온도 동작을 쿼리할 가능성이 높습니다. 버킷 패턴은 데이터를 균일한 기간으로 그룹화하여 이러한 쿼리를 용이하게 합니다.

예제 문서 에는 두 개의 계산된 필드 transaction_countsum_temperature 가 포함되어 있습니다. 애플리케이션에서 특정 시간 동안의 온도 합계를 자주 검색해야 하는 경우 총 합계를 계산하면 애플리케이션 리소스를 절약하는 데 도움이 될 수 있습니다. 이 계산된 패턴 접근 방식을 사용하면 데이터가 요청될 때마다 합계를 계산할 필요가 없습니다.

사전 집계된 sum_temperaturetransaction_count 값을 사용하면 특정 버킷의 평균 온도(sum_temperature / transaction_count)와 같은 추가 계산이 가능합니다. 사용자가 오후 2시 3분에 특정 온도를 쿼리하는 것보다 오후 2시에서 3시 사이의 평균 온도를 애플리케이션에 쿼리할 가능성이 훨씬 더 높습니다. 특정 값을 버킷 지정하고 사전 계산하면 애플리케이션이 해당 정보를 더 쉽게 제공할 수 있습니다.

MongoDB는 기본적으로 시간을 UTC로 저장하며, 모든 현지 시간 표현을 이 형식으로 변환합니다. 수정되지 않은 일부 현지 시간 값으로 작동하거나 보고해야 하는 애플리케이션은 UTC 타임스탬프와 함께 구역을 저장하고 애플리케이션 로직에서 원래 현지 시간을 계산할 수 있습니다.

MongoDB 셸에서는 현재 날짜와 UTC를 기준으로 한 현재 클라이언트 오프셋을 모두 저장할 수 있습니다.

var now = new Date();
db.data.save( { date: now,
offset: now.getTimezoneOffset() } );

저장된 오프셋을 적용하여 원래 현지 시간을 재구성할 수 있습니다.

var record = db.data.findOne();
var localNow = new Date( record.date.getTime() - ( record.offset * 60000 ) );
← 화폐 데이터 모델링