Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

계산된 데이터 저장

이 페이지의 내용

  • 이 작업에 대하여
  • 단계
  • 결과
  • 자세히 알아보기

애플리케이션 은 데이터베이스 에 저장된 소스 데이터에서 값을 도출해야 할 수 있습니다. 새 값을 계산하려면 특히 큰 데이터 세트의 경우나 여러 문서를 검사해야 하는 경우 상당한 CPU 리소스가 필요할 수 있습니다.

계산된 값이 자주 요청되는 경우에는 해당 값을 데이터베이스 에 미리 저장하는 것이 더 효율적일 수 있습니다. 애플리케이션 이 데이터를 요청할 때 읽기 작업은 한 번만 필요합니다.

읽기가 쓰기보다 훨씬 더 일반적인 경우 계산된 패턴 은 데이터 계산 빈도를 줄입니다. 애플리케이션 은 읽을 때마다 값을 계산하는 대신 계산된 값을 저장하고 필요에 따라 다시 계산합니다. 애플리케이션 은 계산된 값의 소스 데이터를 변경하는 쓰기 (write) 마다 또는 주기적인 작업 의 일부로 값을 다시 계산할 수 있습니다.

참고

주기적인 업데이트에서는 반환된 계산 값이 정확하지 않을 수 있습니다. 그러나 정확한 정확성이 요구되지 않는 경우 이 접근 방식은 성능을 개선할 가치가 있을 수 있습니다.

이 예시 에서 애플리케이션 은 영화 뷰어 및 수익 정보를 표시합니다. 사용자는 특정 영화와 해당 영화로 얻은 수익을 조회할 수 있습니다.

1

screenings 컬렉션 을 만듭니다.

db.screenings.insertMany( [
{
theater: "Alger Cinema",
location: "Lakeview, OR",
movie_title: "Lost in the Shadows",
movie_id: 1,
num_viewers: 344,
revenue: 3440
},
{
theater: "City Cinema",
location: "New York, NY",
movie_title: "Lost in the Shadows",
movie_id: 1,
num_viewers: 1496,
revenue: 22440
},
] )
2

사용자는 종종 특정 영화를 본 사람의 수와 해당 영화로 얻은 수익을 알고 싶어합니다. 현재 스키마 에서 num_viewersrevenue 를 추가하려면 제목이 'Lost in the Shadows'인 영화를 상영한 극장에 대한 읽기를 수행하고 해당 필드의 값을 합산해야 합니다.

정보가 요청될 때마다 해당 계산을 수행하지 않으려면 총 값을 계산하여 영화 기록 자체와 함께 movies 컬렉션 에 저장 수 있습니다.

db.movies.insertOne(
{
_id: 1,
title: "Lost in the Shadows",
total_viewers: 1840,
total_revenue: 25880
}
)
3

screenings 컬렉션 에 새로운 심사가 추가되었다고 가정해 보겠습니다.

db.screenings.insertOne(
{
theater: "Overland Park Cinema",
location: "Boise, ID",
movie_title: "Lost in the Shadows",
movie_id: 1,
num_viewers: 760,
revenue: 7600
}
)

movies 컬렉션 의 계산된 데이터는 더 이상 현재 선별 데이터를 반영하지 않습니다. 계산된 데이터를 업데이트 하는 빈도는 애플리케이션 에 따라 다릅니다.

  • 쓰기 (write) 작업량이 적은 환경에서는 screenings 데이터의 모든 업데이트 와 함께 계산이 발생할 수 있습니다.

  • 쓰기가 더 정기적인 환경에서는 정의된 간격( 예시: 매시간)으로 계산을 수행할 수 있습니다. screenings 의 소스 데이터는 movies 컬렉션 에 대한 쓰기의 영향을 받지 않으므로 언제든지 계산을 실행 수 있습니다.

스크리닝 데이터를 기반으로 계산된 데이터를 업데이트 하려면 다음 집계 을 정기적으로 실행 하면 됩니다.

db.screenings.aggregate( [
{
$group: {
_id: "$movie_id",
total_viewers: {
$sum: "$num_viewers"
},
total_revenue: {
$sum: "$revenue"
}
}
},
{
$merge: {
into: { db: "test", coll: "movies" },
on: "_id",
whenMatched: "merge"
}
}
] )
4

movies 컬렉션 이 업데이트되었는지 확인하려면 컬렉션 을 쿼리 합니다.

db.movies.find()

출력:

[
{
_id: 1,
title: 'Lost in the Shadows',
total_viewers: 2600,
total_revenue: 33480
}
]

계산된 패턴 은 CPU 워크로드 를 줄이고 애플리케이션 성능을 향상시킵니다. 애플리케이션 이 동일한 계산을 반복적으로 수행하고 읽기 대 쓰기 (write) 비율이 높은 계산된 패턴 을 고려하세요.

  • 근사화 패턴 사용

  • 그룹 데이터

  • 데이터 일관성

돌아가기

계산된 값