문서 메뉴

문서 홈MongoDB 실행 및 관리MongoDB Atlas

구체화된 보기를 사용하여 Atlas Search 쿼리를 실행하는 방법

이 페이지의 내용

  • purchaseOrders collection 만들기
  • updateMonthlySales 함수 만들기
  • updateMonthlyPurchaseOrders 함수 만들기
  • 예약된 트리거 만들기
  • 구체화된 뷰에서 Atlas Search 인덱스 생성
  • 구체화된 뷰에서 쿼리 실행

이 튜토리얼에서는 다음 기능의 조합을 사용하여 샘플 데이터 세트sample_supplies.sales collection과 새 sample_supplies.purchaseOrders collection에 대해 인덱스를 만들고 쿼리를 실행하는 방법을 설명합니다.

  • 온디맨드 구체화된 뷰

  • Atlas App Services 예약된 트리거

온디맨드 구체화된 뷰는 $merge 집계 파이프라인 단계를 사용하여 생성하고 업데이트하는 컬렉션입니다. 구체화된 뷰에서 Atlas Search 인덱스를 생성한 다음 $search 집계 파이프라인 단계를 사용하여 구체화된 뷰에서 쿼리를 실행할 수 있습니다.

이 튜토리얼에서는 다음 단계를 안내합니다:

  1. sample_supplies 데이터베이스에 purchaseOrders 이라는 이름의 컬렉션을 만듭니다.

  2. App Services UI에서 updateMonthlySales 이라는 App Services 함수를 생성하여 Atlas 클러스터의 샘플 sample_supplies.sales 컬렉션의 데이터를 사용하여 monthlyPhoneTransactions 구체화된 뷰를 초기화합니다.

  3. App Services UI에서 updateMonthlyPurchaseOrders 라는 App Services 함수를 생성하여 Atlas 클러스터에서 생성한 sample_supplies.purchaseOrders 컬렉션의 데이터를 사용하여 monthlyPhoneTransactions 구체화된 뷰를 업데이트합니다.

  4. App Services 예약된 트리거를 사용하여 monthlyPhoneTransactions 구체화된 뷰를 주기적으로 업데이트하도록 다음 함수를 예약합니다.

    1. updateMonthlySales

    2. updateMonthlyPurchaseOrders

  5. monthlyPhoneTransactions 구체화된 뷰에 Atlas Search 인덱스를 생성합니다.

  6. monthlyPhoneTransactions 구체화된 뷰에서 쿼리를 실행합니다.

시작하기 전에 Atlas cluster가 필수구성 요소에 설명된 요건을 충족하는지 확인하십시오.

Atlas Search 인덱스를 생성하려면 프로젝트에 대한 Project Data Access Admin 이상의 액세스 권한이 있어야 합니다.

App Services 함수 및 트리거를 만들려면 프로젝트에 대한 Project Owner 이상의 액세스 권한이 있어야 합니다.

1
  1. 터미널 창에서 mongosh 를 열고 클러스터에 연결합니다. 연결에 대한 자세한 지침은 mongosh 를 통한 연결을 참조하세요.

  2. sample_supplies 데이터베이스를 사용합니다.

    use sample_supplies
2

2018 월의 새 전화 구매 주문 데이터가 포함된 purchaseOrders 컬렉션을 추가합니다. 다음 명령을 실행합니다.

db.purchaseOrders.insertMany( [
{
saleDate: ISODate("2018-01-23T21:06:49.506Z"),
items: [
{
name: 'printer paper',
tags: [ 'office', 'stationary' ],
price: Decimal128("40.01"),
quantity: 2
},
{
name: 'notepad',
tags: [ 'office', 'writing', 'school' ],
price: Decimal128("35.29"),
quantity: 2
},
{
name: 'pens',
tags: [ 'writing', 'office', 'school', 'stationary' ],
price: Decimal128("56.12"),
quantity: 5
},
{
name: 'backpack',
tags: [ 'school', 'travel', 'kids' ],
price: Decimal128("77.71"),
quantity: 2
},
{
name: 'notepad',
tags: [ 'office', 'writing', 'school' ],
price: Decimal128("18.47"),
quantity: 2
},
{
name: 'envelopes',
tags: [ 'stationary', 'office', 'general' ],
price: Decimal128("19.95"),
quantity: 8
},
{
name: 'envelopes',
tags: [ 'stationary', 'office', 'general' ],
price: Decimal128("8.08"),
quantity: 3
},
{
name: 'binder',
tags: [ 'school', 'general', 'organization' ],
price: Decimal128("14.16"),
quantity: 3
}
],
storeLocation: 'Denver',
customer: {
gender: 'M',
age: 42,
email: 'cauho@witwuta.sv',
satisfaction: 4
},
couponUsed: true,
purchaseMethod: 'Phone'
}
])
db.purchaseOrders.insertMany( [
{
saleDate: ISODate("2018-01-25T10:01:02.918Z"),
items: [
{
name: 'envelopes',
tags: [ 'stationary', 'office', 'general' ],
price: Decimal128("8.05"),
quantity: 10
},
{
name: 'binder',
tags: [ 'school', 'general', 'organization' ],
price: Decimal128("28.31"),
quantity: 9
},
{
name: 'notepad',
tags: [ 'office', 'writing', 'school' ],
price: Decimal128("20.95"),
quantity: 3
},
{
name: 'laptop',
tags: [ 'electronics', 'school', 'office' ],
price: Decimal128("866.5"),
quantity: 4
},
{
name: 'notepad',
tags: [ 'office', 'writing', 'school' ],
price: Decimal128("33.09"),
quantity: 4
},
{
name: 'printer paper',
tags: [ 'office', 'stationary' ],
price: Decimal128("37.55"),
quantity: 1
},
{
name: 'backpack',
tags: [ 'school', 'travel', 'kids' ],
price: Decimal128("83.28"),
quantity: 2
},
{
name: 'pens',
tags: [ 'writing', 'office', 'school', 'stationary' ],
price: Decimal128("42.9"),
quantity: 4
},
{
name: 'envelopes',
tags: [ 'stationary', 'office', 'general' ],
price: Decimal128("16.68"),
quantity: 2
}
],
storeLocation: 'Seattle',
customer: { gender: 'M', age: 50, email: 'keecade@hem.uy', satisfaction: 5 },
couponUsed: false,
purchaseMethod: 'Phone'
}
])
3

purchaseOrders 컬렉션을 쿼리하여 새 구매 주문서 항목을 확인합니다.

db.purchaseOrders.find().sort( {saleDate: -1} )

두 쿼리 결과는 구매 주문서 데이터가 2018 1월에 종료됨을 반영합니다.

App Services UI에서 updateMonthlySales 함수를 만듭니다.

updateMonthlySales 함수는 월별 누적 판매 정보가 포함된 monthlyPhoneTransactions 구체화된 뷰를 정의합니다. 이 기능은 전화를 통해 수행된 판매에 대한 월별 판매 정보를 업데이트합니다.

다음 예제에서는 함수를 정의합니다.

exports = function(){
var pipeline = [
{ $match: {purchaseMethod: "Phone"} },
{ $unwind: {path: "$items"}},
{ $group: {
_id: { $dateToString:
{ format: "%Y-%m", date: "$saleDate" } },
sales_quantity: { $sum: "$items.quantity"},
sales_price: { $sum: "$items.price"}
}},
{ $set: { sales_price: { $toDouble: "$sales_price"}}},
{ $merge: { into: "monthlyPhoneTransactions", whenMatched: "replace" } }
]
var monthlyPhoneTransactions = context.services.get("mongodb-atlas").db("sample_supplies").collection("sales");
return monthlyPhoneTransactions.aggregate(pipeline);
};

이 함수는 다음 집계 파이프라인 단계를 사용하여 monthlyPhoneTransactions 을(를) 업데이트합니다.

  • $match 단계에서는 데이터를 필터링하여 Phone 동안 완료된 판매만 처리합니다.

  • $group 단계에서는 판매 정보를 연도-월별로 그룹화합니다. 이 단계에서는 다음과 같은 형식의 문서가 출력됩니다.

    { "_id" : "<YYYY-mm>", "sales_quantity" : <num>, "sales_amount" : <NumberDecimal> }
  • $set 단계에서는 sales_price 필드의 데이터 유형을 double 로 변경합니다. Atlas Search $search 연산자는 Decimal128 데이터 유형을 지원하지 않습니다. sales_price 필드의 데이터 유형을 변경하면 Atlas Search 인덱스를 사용하여 이 필드를 쿼리할 수 있습니다.

  • $merge 단계에서는 출력을 monthlyPhoneTransactions 컬렉션에 씁니다.

    이 단계에서는 _id 필드(샤딩되지 않은 출력 컬렉션의 기본값)를 기반 으로 애그리게이션 결과의 문서가 컬렉션의 기존 문서 와 일치 하는지 확인합니다.

    • Atlas Search가 일치 하는 항목을 찾으면(즉, 컬렉션에 연도가 같은 문서가 이미 존재하는 경우) Atlas Search 기존 문서를 단계에 지정된 애그리게이션 결과의 문서로 대체합니다.

    • 일치 하는 항목을 찾지 못하면 Atlas Search는 단계에서 지정된 대로 애그리게이션 결과의 문서를 컬렉션에 삽입합니다. 이는 필드와 일치하는 항목이 없을 때의 기본 동작입니다.

1

UI에서 새 서버 측 함수를 정의하려면 먼저 App Services App을 만들어야 합니다.

  1. 아직 클릭하지 않은 경우 App Services 탭을 클릭합니다.

  2. 앱을 만듭니다:

    • 프로젝트에서 첫 번째 App Services App을 만드는 경우 템플릿(Build your own App) 없이 시작할 수 있는 옵션이 표시됩니다. Build your own App 옵션을 선택합니다.

    • 프로젝트에 App Services App을 이미 하나 이상 만든 경우 Create a New App 을 클릭합니다.

  3. Name 필드에 함수 이름으로 Sales-App 를 입력합니다.

  4. Link your Database 필드에서 Use an existing MongoDB Atlas Data Source 옵션을 선택합니다.

  5. 드롭다운의 필수 구성 요소에서 생성한 Atlas 클러스터를 선택합니다.

  6. Create App Service를 클릭합니다.

2

UI에서 새 서버 측 함수를 정의하려면 다음을 수행합니다.

  1. 왼쪽 탐색 패널에서 Functions 을 클릭합니다.

  2. Create New Function를 클릭합니다.

  3. 함수 이름으로 updateMonthlySales 를 입력합니다.

  4. Authentication에서 System을 선택합니다.

3
  1. Function Editor 탭을 클릭합니다.

  2. exports 함수에 JavaScript 코드를 추가합니다. 최소한 코드는 전역 변수 exports 에 함수를 할당해야 합니다.

    exports = function(){
    var pipeline = [
    { $match: {purchaseMethod: "Phone"} },
    { $unwind: {path: "$items"}},
    { $group: {
    _id: { $dateToString:{ format: "%Y-%m", date: "$saleDate" } },
    sales_quantity: { $sum: "$items.quantity"},
    sales_price: { $sum: "$items.price"}
    }
    },
    { $set: { sales_price: { $toDouble: "$sales_price"}}},
    { $merge: { into: "monthlyPhoneTransactions", whenMatched: "replace" } }
    ]
    var monthlyPhoneTransactions = context.services.get("mongodb-atlas").db("sample_supplies").collection("sales");
    return monthlyPhoneTransactions.aggregate(pipeline);
    };
  3. Function Editor 의 오른쪽 하단에 있는 Run 버튼을 클릭하여 monthlyPhoneTransactions 구체화된 뷰를 생성합니다.

    Function Editor 하단의 Result 탭은 오류 없이 성공했음을 나타내야 합니다.

  4. Save Draft를 클릭합니다.

4
  1. 터미널 창에서 mongosh 를 열고 클러스터에 연결합니다. 연결에 대한 자세한 지침은 mongosh 를 통한 연결을 참조하세요.

  2. sample_supplies 데이터베이스를 사용합니다.

    use sample_supplies
  3. sales 컬렉션을 쿼리합니다. sales 의 마지막 판매는 2017 의 12월에 발생합니다.

    db.sales.find().sort( {saleDate: -1} )
  4. 구체화된 뷰가 sample_supplies 데이터베이스에 생성되었는지 확인합니다.

    show collections

    이 명령은 새로 생성된 monthlyPhoneTransactions 구체화된 뷰를 포함하여 컬렉션을 나열합니다.

  5. monthlyPhoneTransactions 구체화된 뷰를 쿼리합니다.

    db.monthlyPhoneTransactions.find().sort( { _id: -1} )

    monthlyPhoneTransactions 구체화된 뷰에는 새로 추가된 데이터가 표시됩니다. 맨 위 결과는 가장 최근 트랜잭션이 12월 2017 에 발생했음을 반영합니다.

App Services UI에서 updateMonthlyPurchaseOrders 함수를 만듭니다.

updateMonthlyPurchaseOrders 함수는 monthlyPhoneTransactions 구체화된 뷰에 월별 누적 구매 주문 정보를 추가합니다. 이 기능은 전화를 통해 수행된 구매 주문에 대한 월별 구매 주문 정보를 업데이트합니다.

다음 예제에서는 함수를 정의합니다.

exports = function(){
var pipeline = [
{ $match: {purchaseMethod: "Phone"} },
{ $unwind: {path: "$items"}},
{ $group: {
_id: { $dateToString:
{ format: "%Y-%m", date: "$saleDate" } },
sales_quantity: { $sum: "$items.quantity"},
sales_price: { $sum: "$items.price"}
}},
{ $set: { sales_price: { $toDouble: "$sales_price"}}},
{ $merge: { into: "monthlyPhoneTransactions", whenMatched: "replace" } }
]
var monthlyPhoneTransactions = context.services.get("mongodb-atlas").db("sample_supplies").collection("purchaseOrders");
return monthlyPhoneTransactions.aggregate(pipeline);
};

updateMonthlyPurchaseOrders 함수는 updateMonthlySales 함수와 동일한 집계 파이프라인 단계를 사용하여 monthlyPhoneTransactions 를 업데이트합니다.

1

UI에서 새 서버 측 함수를 정의하려면 다음을 수행합니다.

  1. App Services App으로 돌아갑니다.

  2. 왼쪽 탐색 패널에서 Functions 을 클릭합니다.

  3. Create New Function를 클릭합니다.

  4. 함수 이름으로 updateMonthlyPurchaseOrders 를 입력합니다.

  5. Authentication에서 System을 선택합니다.

2
  1. Function Editor 탭을 클릭합니다.

  2. exports 함수에 JavaScript 코드를 추가합니다. 최소한 코드는 전역 변수 exports 에 함수를 할당해야 합니다.

    exports = function(){
    var pipeline = [
    { $match: {purchaseMethod: "Phone"} },
    { $unwind: {path: "$items"}},
    { $group: {
    _id: { $dateToString:{ format: "%Y-%m", date: "$saleDate" } },
    sales_quantity: { $sum: "$items.quantity"},
    sales_price: { $sum: "$items.price"}
    }
    },
    { $set: { sales_price: { $toDouble: "$sales_price"}}},
    { $merge: { into: "monthlyPhoneTransactions", whenMatched: "replace" } }
    ]
    var monthlyPhoneTransactions = context.services.get("mongodb-atlas").db("sample_supplies").collection("purchaseOrders");
    return monthlyPhoneTransactions.aggregate(pipeline);
    };
  3. Function Editor 의 오른쪽 하단에 있는 Run 버튼을 클릭하여 monthlyPhoneTransactions 구체화된 뷰를 업데이트합니다.

    Function Editor 하단의 Result 탭은 오류 없이 성공했음을 나타내야 합니다.

    updateMonthlyPurchaseOrders 함수는 2018 1월 구매 주문 데이터로 monthlyPhoneTransactions 구체화된 뷰를 새로 고칩니다.

  4. Save Draft를 클릭합니다.

3
  1. mongosh 로 돌아가서 monthlyPhoneTransactions 컬렉션을 쿼리하여 업데이트를 확인합니다.

    db.monthlyPhoneTransactions.find().sort( { _id: -1} )

    monthlyPhoneTransactions 구체화된 뷰에는 새로 추가된 데이터가 표시됩니다. 맨 위 결과는 가장 최근의 트랜잭션이 2018 월에 발생했음을 반영합니다.

이전 단계에서 생성한 App Services 함수가 하루에 한 번 실행되도록 예약하여 구체화된 뷰를 최신 상태로 유지합니다.

1
2
3
UI 필드 이름
구성
Trigger Type
Scheduled0}을 선택합니다.
Name
updateMonthlySales를 지정합니다.
Schedule Type
  1. Basic0}을 선택합니다.

  2. Repeat once by 에 대해 Day of the Month 을 선택하고 값을 원하는 날짜로 설정합니다.

    참고

    또는 테스트 목적으로 Repeat once by 드롭다운을 Minute 또는 Hour와 같이 더 자주 발생하도록 설정합니다.

Select An Event Type
Function0}을 선택합니다.
Function
updateMonthlySales0}을 선택합니다.
4
5
6
7
UI 필드 이름
구성
Trigger Type
Scheduled0}을 선택합니다.
Name
updateMonthlyPurchaseOrders를 지정합니다.
Schedule Type
  1. Basic0}을 선택합니다.

  2. Repeat once by 에 대해 Day of the Month 을 선택하고 값을 원하는 날짜로 설정합니다.

    참고

    또는 테스트 목적으로 Repeat once by 드롭다운을 Minute 또는 Hour와 같이 더 자주 발생하도록 설정합니다.

Select An Event Type
Function0}을 선택합니다.
Function
updateMonthlyPurchaseOrders0}을 선택합니다.
8
9

monthlyPhoneTransactions 컬렉션에 Atlas Search 인덱스를 만듭니다.

1

Atlas의 왼쪽 상단에 있는 Database 클릭하여 프로젝트의 Database Deployments 페이지로 이동합니다.

2
3
4
5
6
  1. Index Name 필드에 monthlyPhoneTransactions를 입력합니다.

  2. Database and Collection 섹션에서 sample_supplies 데이터베이스를 찾고 monthlyPhoneTransactions 컬렉션을 선택합니다.

  3. Next를 클릭합니다.

7
8
9

인덱스가 작성 중임을 보여주는 모달 창이 표시됩니다. Close 버튼을 클릭합니다.

10

새로 생성된 인덱스가 Atlas Search 탭에 나타납니다. 인덱스가 빌드되는 동안 Status 필드는 Build in Progress를 읽습니다. 인덱스 빌드가 완료되면 Status 필드에 Active가 표시됩니다.

참고

컬렉션이 클수록 인덱스를 생성하는 데 시간이 더 오래 걸립니다. 인덱스 빌드가 완료되면 이메일 알림을 받게 됩니다.

새로 업데이트되고 인덱싱된 monthlyPhoneTransactions 컬렉션에 대해 쿼리를 실행합니다.

1

터미널 창에서 mongosh 를 열고 클러스터에 연결합니다. 연결에 대한 자세한 지침은 mongosh 를 통한 연결을 참조하세요.

2

mongosh 프롬프트에서 다음 명령을 실행합니다.

use sample_supplies
3

다음 쿼리는 총 매출이 10000 달러 이상인 monthPhoneTransactions 의 개월 수를 계산합니다.

db.monthlyPhoneTransactions.aggregate([
{
$search: {
"index": "monthlySalesIndex",
"range": {
"gt": 10000,
"path": ["sales_price"]
}
}
},
{
$count: 'months_w_over_10000'
},
])

위의 쿼리는 4 을 반환하며, 이는 monthlyPhoneTransactions 구체화된 뷰의 모든 월 중 4 개월만 총 매출이 10000 달러 이상임을 나타냅니다. 이 결과는 sample_supplies.salessample_supplies.purchaseOrders 컬렉션의 데이터를 모두 반영합니다.

전체 집계 파이프라인 설명서는 MongoDB Server 매뉴얼을 참조하세요.

← 컬렉션 전반에서 Atlas 검색 쿼리를 실행하는 방법