문서 홈 → MongoDB 실행 및 관리 → MongoDB Atlas
구체화된 보기를 사용하여 Atlas Search 쿼리를 실행하는 방법
이 페이지의 내용
이 튜토리얼에서는 다음 기능의 조합을 사용하여 샘플 데이터 세트 의 sample_supplies.sales
collection과 새 sample_supplies.purchaseOrders
collection에 대해 인덱스를 만들고 쿼리를 실행하는 방법을 설명합니다.
온디맨드 구체화된 뷰는 $merge
집계 파이프라인 단계를 사용하여 생성하고 업데이트하는 컬렉션입니다. 구체화된 뷰에서 Atlas Search 인덱스를 생성한 다음 $search
집계 파이프라인 단계를 사용하여 구체화된 뷰에서 쿼리를 실행할 수 있습니다.
이 튜토리얼에서는 다음 단계를 안내합니다:
sample_supplies
데이터베이스에purchaseOrders
이라는 이름의 컬렉션을 만듭니다.App Services UI에서
updateMonthlySales
이라는 App Services 함수를 생성하여 Atlas 클러스터의 샘플sample_supplies.sales
컬렉션의 데이터를 사용하여monthlyPhoneTransactions
구체화된 뷰를 초기화합니다.App Services UI에서
updateMonthlyPurchaseOrders
라는 App Services 함수를 생성하여 Atlas 클러스터에서 생성한sample_supplies.purchaseOrders
컬렉션의 데이터를 사용하여monthlyPhoneTransactions
구체화된 뷰를 업데이트합니다.App Services 예약된 트리거를 사용하여
monthlyPhoneTransactions
구체화된 뷰를 주기적으로 업데이트하도록 다음 함수를 예약합니다.updateMonthlySales
updateMonthlyPurchaseOrders
monthlyPhoneTransactions
구체화된 뷰에 Atlas Search 인덱스를 생성합니다.monthlyPhoneTransactions
구체화된 뷰에서 쿼리를 실행합니다.
시작하기 전에 Atlas cluster가 필수구성 요소에 설명된 요건을 충족하는지 확인하십시오.
Atlas Search 인덱스를 생성하려면 프로젝트에 대한 Project Data Access Admin
이상의 액세스 권한이 있어야 합니다.
App Services 함수 및 트리거를 만들려면 프로젝트에 대한 Project Owner
이상의 액세스 권한이 있어야 합니다.
purchaseOrders
컬렉션 만들기
sample_supplies
데이터베이스에 연결합니다.
터미널 창에서
mongosh
를 열고 클러스터에 연결합니다. 연결에 대한 자세한 지침은mongosh
를 통한 연결을 참조하세요.sample_supplies
데이터베이스를 사용합니다.use sample_supplies
새 컬렉션을 추가합니다.
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' } ])
updateMonthlySales
함수 만들기
App Services UI에서 updateMonthlySales 함수를 만듭니다.
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
필드(샤딩되지 않은 출력 컬렉션의 기본값)를 기반 으로 애그리게이션 결과의 문서가 컬렉션의 기존 문서 와 일치 하는지 확인합니다.
절차
새 앱을 만듭니다.
UI에서 새 서버 측 함수를 정의하려면 먼저 App Services App을 만들어야 합니다.
아직 클릭하지 않은 경우 App Services 탭을 클릭합니다.
앱을 만듭니다:
프로젝트에서 첫 번째 App Services App을 만드는 경우 템플릿(Build your own App) 없이 시작할 수 있는 옵션이 표시됩니다. Build your own App 옵션을 선택합니다.
프로젝트에 App Services App을 이미 하나 이상 만든 경우 Create a New App 을 클릭합니다.
Name 필드에 함수 이름으로
Sales-App
를 입력합니다.Link your Database 필드에서 Use an existing MongoDB Atlas Data Source 옵션을 선택합니다.
Create App Service를 클릭합니다.
updateMonthlySales
함수 코드를 입력합니다.
Function Editor 탭을 클릭합니다.
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); }; Function Editor 의 오른쪽 하단에 있는 Run 버튼을 클릭하여
monthlyPhoneTransactions
구체화된 뷰를 생성합니다.Function Editor 하단의 Result 탭은 오류 없이 성공했음을 나타내야 합니다.
Save Draft를 클릭합니다.
함수를 테스트합니다.
터미널 창에서
mongosh
를 열고 클러스터에 연결합니다. 연결에 대한 자세한 지침은mongosh
를 통한 연결을 참조하세요.sample_supplies
데이터베이스를 사용합니다.use sample_supplies sales
컬렉션을 쿼리합니다.sales
의 마지막 판매는 2017 의 12월에 발생합니다.db.sales.find().sort( {saleDate: -1} ) 구체화된 뷰가
sample_supplies
데이터베이스에 생성되었는지 확인합니다.show collections 이 명령은 새로 생성된
monthlyPhoneTransactions
구체화된 뷰를 포함하여 컬렉션을 나열합니다.monthlyPhoneTransactions
구체화된 뷰를 쿼리합니다.db.monthlyPhoneTransactions.find().sort( { _id: -1} ) monthlyPhoneTransactions
구체화된 뷰에는 새로 추가된 데이터가 표시됩니다. 맨 위 결과는 가장 최근 트랜잭션이 12월 2017 에 발생했음을 반영합니다.
updateMonthlyPurchaseOrders
함수 만들기
App Services UI에서 updateMonthlyPurchaseOrders 함수를 만듭니다.
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
를 업데이트합니다.
절차
updateMonthlyPurchaseOrders
함수 코드 입력
Function Editor 탭을 클릭합니다.
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); }; Function Editor 의 오른쪽 하단에 있는 Run 버튼을 클릭하여
monthlyPhoneTransactions
구체화된 뷰를 업데이트합니다.Function Editor 하단의 Result 탭은 오류 없이 성공했음을 나타내야 합니다.
updateMonthlyPurchaseOrders
함수는 2018 1월 구매 주문 데이터로monthlyPhoneTransactions
구체화된 뷰를 새로 고칩니다.Save Draft를 클릭합니다.
업데이트를 확인합니다.
mongosh
로 돌아가서monthlyPhoneTransactions
컬렉션을 쿼리하여 업데이트를 확인합니다.db.monthlyPhoneTransactions.find().sort( { _id: -1} ) monthlyPhoneTransactions
구체화된 뷰에는 새로 추가된 데이터가 표시됩니다. 맨 위 결과는 가장 최근의 트랜잭션이 2018 월에 발생했음을 반영합니다.
예약된 트리거 만들기
이전 단계에서 생성한 App Services 함수가 하루에 한 번 실행되도록 예약하여 구체화된 뷰를 최신 상태로 유지합니다.
트리거에 대한 구성 값을 입력합니다.
UI 필드 이름 | 구성 |
---|---|
Trigger Type | Scheduled0}을 선택합니다. |
Name | updateMonthlySales 를 지정합니다. |
Schedule Type |
|
Select An Event Type | Function0}을 선택합니다. |
Function | updateMonthlySales 0}을 선택합니다. |
새 트리거에 대한 구성 값을 입력합니다.
UI 필드 이름 | 구성 |
---|---|
Trigger Type | Scheduled0}을 선택합니다. |
Name | updateMonthlyPurchaseOrders 를 지정합니다. |
Schedule Type |
|
Select An Event Type | Function0}을 선택합니다. |
Function | updateMonthlyPurchaseOrders 0}을 선택합니다. |
구체화된 뷰에서 Atlas Search 인덱스 생성
monthlyPhoneTransactions
컬렉션에 Atlas Search 인덱스를 만듭니다.
구체화된 뷰에서 쿼리 실행
새로 업데이트되고 인덱싱된 monthlyPhoneTransactions
컬렉션에 대해 쿼리를 실행합니다.
mongosh
에서 클러스터에 연결합니다.
터미널 창에서 mongosh
를 열고 클러스터에 연결합니다. 연결에 대한 자세한 지침은 mongosh
를 통한 연결을 참조하세요.
sample_supplies
데이터베이스를 사용합니다.
mongosh
프롬프트에서 다음 명령을 실행합니다.
use sample_supplies
sample_supplies.monthlyPhoneTransactions
컬렉션에서 간단한 Atlas Search 쿼리를 실행합니다.
다음 쿼리는 총 매출이 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.sales
및 sample_supplies.purchaseOrders
컬렉션의 데이터를 모두 반영합니다.
전체 집계 파이프라인 설명서는 MongoDB Server 매뉴얼을 참조하세요.