구체화된 보기를 사용하여 Atlas Search 쿼리를 실행하는 방법
이 자습서에서는 샘플 데이터 세트와 새 sample_supplies.purchaseOrders
에서 sample_supplies.sales
컬렉션에 대해 인덱스를 생성하고 쿼리를 실행하는 방법을 설명합니다.
온디맨드 구체화된 뷰는 $merge
집계 파이프라인 단계를 사용하여 만들고 업데이트할 수 있는 컬렉션입니다. 구체화된 뷰에서 Atlas Search 인덱스를 생성한 다음 $search
집계 파이프라인 단계를 사용하여 구체화된 뷰에서 쿼리를 실행할 수 있습니다.
이 튜토리얼에서는 다음 단계를 안내합니다:
sample_supplies
데이터베이스에purchaseOrders
라는 이름의 컬렉션을 생성합니다.예약된 트리거 두 개를 생성합니다.
updateMonthlySales
, 샘플sample_supplies.sales
컬렉션의 데이터를 사용하여monthlyPhoneTransactions
구체화된 뷰를 초기화하는updateMonthlySales
함수가 포함되어 있습니다.updateMonthlyPurchaseOrders
,sample_supplies.purchaseOrders
컬렉션의 데이터를 사용하여monthlyPhoneTransactions
구체화된 뷰를 업데이트하는updateMonthlyPurchaseOrders
함수가 있습니다.
monthlyPhoneTransactions
구체화된 뷰에 Atlas Search 인덱스를 만듭니다.monthlyPhoneTransactions
구체화된 뷰에서 쿼리를 실행합니다.
시작하기 전에 Atlas 클러스터가 필수구성 요소에 설명된 요건을 충족하는지 확인하십시오.
Atlas Search 인덱스를 생성하려면 프로젝트에 대한 Project Data Access Admin
이상의 액세스 권한이 있어야 합니다.
트리거를 생성하려면 프로젝트에 대한 Project Owner
이상의 액세스 권한이 있어야 합니다.
컬렉션 생성<a class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\"purchaseOrders
\" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \">
데이터베이스에 sample_supplies
연결합니다.
터미널 창에서
mongosh
를 열고 클러스터에 연결합니다. 연결에 대한 자세한 지침은mongosh
을 통해 연결하기를 참조하세요.sample_supplies
데이터베이스를 사용합니다.use sample_supplies
새 컬렉션을 추가합니다.
2018년 1월의 새 휴대폰 구매 주문 데이터가 포함된 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' } ])
새로운 컬렉션을 쿼리합니다.
purchaseOrders
컬렉션을 쿼리하여 새 구매 주문 항목을 확인합니다.
db.purchaseOrders.find().sort( {saleDate: -1} )
{ _id: ObjectId("62434c07d574cd0ce200ba75"), 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' }, { _id: ObjectId("62434c07d574cd0ce200ba74"), 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' }
두 쿼리 결과는 구매 주문 데이터가 2018년 1월에 종료됨을 반영합니다.
예정된 트리거 생성
다음 절차에서는 트리거를 생성하여 구체화된 뷰를 생성하고 구체화된 뷰를 매일 업데이트하도록 함수를 예약합니다.
트리거만들기 updateMonthlySales
절차
AtlasGo Atlas 에서 프로젝트 의 Triggers 페이지로 고 (Go) 합니다.
아직 표시되지 않은 경우 탐색 표시줄의 Organizations 메뉴에서 프로젝트가 포함된 조직을 선택합니다.
아직 표시되지 않은 경우 내비게이션 바의 Projects 메뉴에서 프로젝트를 선택합니다.
사이드바에서 Services 제목 아래의 Triggers를 클릭합니다.
트리거 페이지가 표시됩니다.
함수를 만듭니다.
이 트리거의 함수는 월간 누적 판매 정보가 포함된 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
컬렉션에 기록합니다.
트리거만들기 updateMonthlyPurchaseOrders
절차
AtlasGo Atlas 에서 프로젝트 의 Triggers 페이지로 고 (Go) 합니다.
아직 표시되지 않은 경우 탐색 표시줄의 Organizations 메뉴에서 프로젝트가 포함된 조직을 선택합니다.
아직 표시되지 않은 경우 내비게이션 바의 Projects 메뉴에서 프로젝트를 선택합니다.
사이드바에서 Services 제목 아래의 Triggers를 클릭합니다.
트리거 페이지가 표시됩니다.
함수를 만듭니다.
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
를 업데이트합니다.
애플리케이션 초안을 검토하고 Sales-App
배포하세요.
mongosh
를 사용하여 monthlyPhoneTransactions
컬렉션을 쿼리하여 업데이트를 확인합니다.
db.monthlyPhoneTransactions.find().sort( { _id: -1} )
{ _id: '2018-01', sales_quantity: 66, sales_price: Decimal128("1407.10") }
monthlyPhoneTransactions
구체화된 뷰는 새로 추가된 데이터를 보여줍니다. 상위 결과는 가장 최근 트랜잭션이 2018 1월에 발생했음을 반영합니다.
애플리케이션 초안을 검토하고 Sales-App
배포하세요.
구체화된 뷰에 Atlas Search 인덱스 생성
monthlyPhoneTransactions
컬렉션에 Atlas Search 인덱스를 만듭니다.
AtlasGo Atlas 에서 프로젝트 의 Clusters 페이지로 고 (Go) 합니다.
아직 표시되지 않은 경우 탐색 표시줄의 Organizations 메뉴에서 원하는 프로젝트가 포함된 조직을 선택합니다.
아직 표시되지 않은 경우 탐색 표시줄의 Projects 메뉴에서 원하는 프로젝트를 선택합니다.
아직 표시되지 않은 경우 사이드바에서 Clusters 클릭하세요.
Clusters(클러스터) 페이지가 표시됩니다.
클러스터의 Atlas Search 페이지로 이동합니다.
사이드바, Data Explorer 또는 클러스터 세부 정보 페이지에서 Atlas Search 페이지로 이동할 수 있습니다.
사이드바에서 Services 제목 아래의 Atlas Search를 클릭합니다.
Select data source 드롭다운에서 클러스터를 선택하고 Go to Atlas Search를 클릭합니다.
Atlas Search 페이지가 표시됩니다.
cluster의 Browse Collections 버튼을 클릭합니다.
데이터베이스를 확장하고 컬렉션을 선택합니다.
컬렉션의 Search Indexes 탭을 클릭합니다.
Atlas Search 페이지가 표시됩니다.
클러스터 이름을 클릭합니다.
Atlas Search 탭을 클릭합니다.
Atlas Search 페이지가 표시됩니다.
구체화된 뷰에서 쿼리 실행
새로 업데이트되고 인덱싱된 monthlyPhoneTransactions
컬렉션에 대해 쿼리를 실행합니다.
에서 mongosh
클러스터에연결합니다.
터미널 창에서 mongosh
를 열고 클러스터에 연결합니다. 연결에 대한 자세한 지침은 mongosh
를 통한 연결을 참조하세요.
데이터베이스를 사용합니다.<a sample_supplies
class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \">
mongosh
프롬프트에서 다음 명령을 실행합니다.
use sample_supplies
컬렉션에서 복잡한 Atlas Search 쿼리를 sample_supplies.monthlyPhoneTransactions
실행합니다.
다음 쿼리는 monthlyPhoneTransactions에서 총 판매액이 10000
달러 이상인 개월 수를 계산합니다.
db.monthlyPhoneTransactions.aggregate([ { $search: { "index": "monthlySalesIndex", "range": { "gt": 10000, "path": ["sales_price"] } } }, { $count: 'months_w_over_10000' }, ])
위 쿼리는 4
를 반환하는데, 이는 monthlyPhoneTransactions
구체화된 뷰의 전체 월 중 총 매출이 10000달러 이상인 달은 4개월뿐임을 나타냅니다. 이 결과는 sample_supplies.sales
및 sample_supplies.purchaseOrders
컬렉션의 데이터를 모두 반영합니다.
전체 집계 파이프라인 설명서는 MongoDB Server 매뉴얼을 참조하세요.