쿼리 결과 페이지 매기기 방법
이 페이지의 내용
이 튜토리얼은 애플리케이션에서 '다음 페이지' 및 '이전 페이지'와 같은 기능을 구축하기 위해 Atlas Search 쿼리 결과를 페이지 매김하는 방법을 보여줍니다. 또한 $skip
및 $limit
를 사용하여 페이지 간에 이동하는 방법을 보여줍니다. 이 튜토리얼에서는 다음 단계를 안내합니다.
sample_mflix.movies
컬렉션에 대한 정적 매핑을 사용하여 Atlas Search 인덱스를 설정합니다.인덱싱된 필드에 대해 Atlas Search 쿼리를 실행하면 순차적 결과가 반환되며, 이를 통해 다음을 수행할 수 있습니다.
'다음 페이지', '이전 페이지'와 같은 기능을 빌드하기 위해 페이지를 순회합니다.
2페이지에서 5페이지로 이동하고 결과에서 페이지를 건너뜁니다.
결과에서 각 장르의 총 영화 수 개수를 조회합니다.
시작하기 전에 Atlas 클러스터가 필수 구성 요소에 설명된 요건을 충족하는지 확인하세요.
참고
Atlas Search $search
searchSequenceToken
을 사용하여 순차적 결과를 검색하려면 Atlas 클러스터는 MongoDB v6.0.13+ 또는 v7.0.5+를 실행해야 합니다.
정적 매핑으로 Atlas Search 인덱스 생성
이 섹션에서는 sample_mflix.movies
컬렉션의 필드를 인덱싱하기 위해 정적 매핑을 사용하는 Atlas Search 인덱스를 만듭니다.
필수 역할
Atlas Search 인덱스를 생성하려면 프로젝트에 대한 Project Data Access Admin
이상의 액세스 권한이 있어야 합니다.
절차
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 페이지가 표시됩니다.
Atlas Search 인덱스를 정의합니다.
다음 인덱스 정의는 다음 필드에 대한 인덱스를 구성합니다.
title
필드에 대한 전체 텍스트 검색을 위한 string 유형genres
는 필드에 대한 패싯 검색을 위한 stringFacet 유형released
필드를 사용하여 결과를 정렬하기 위한 날짜 유형으로 필드 사용
Atlas 사용자 인터페이스에서 Atlas Search Visual Editor 또는 Atlas Search JSON Editor를 사용하여 인덱스를 생성할 수 있습니다.
Next를 클릭합니다.
Refine Your Index를 클릭합니다.
Index Configurations 섹션에서 Dynamic Mapping을 비활성화하도록 토글합니다.
Field Mappings 섹션에서 Add Field를 클릭하고, Add Field Mapping 창 Customized Configuration 탭에서 다음 필드에 대한 설정을 하나씩 구성한 후 Add를 클릭합니다.
필드 이름데이터 유형 구성title
Stringgenres
stringFacetreleased
DateSave Changes를 클릭합니다.
기본 인덱스 정의를 다음 정의로 바꿉니다.
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "title": { 6 "type": "string" 7 }, 8 "genres": { 9 "type": "stringFacet" 10 }, 11 "released": { 12 "type": "date" 13 } 14 } 15 } 16 } Next를 클릭합니다.
쿼리 실행 및 결과 페이지 매기기
이 섹션에서는 제목에 summer
용어가 포함된 영화의 결과를 조회하는 쿼리를 실행합니다. 쿼리에서 참조 지점을 검색하고, 후속 쿼리에서 이를 사용하여 지정된 참조 지점 전후의 동일한 용어에 대한 추가 결과를 조회합니다.
참고
기본적으로 Atlas Search는 문서의 관련성 점수에 따라 결과의 문서를 정렬합니다. 결과 내 여러 문서가 동일한 점수를 가질 경우 Atlas Search는 임의로 정렬된 결과를 반환합니다. 지정된 순서로 문서를 반환하려면 쿼리가 결과를 정렬할 고유한 필드인 released
를 지정합니다.
이 섹션에서는 다음을 수행하는 방법을 설명합니다.
절차
이러한 쿼리를 실행 하려면 먼저 다음을 수행해야 합니다.
에서 mongosh
클러스터에연결합니다.
터미널 창에서 mongosh
를 열고 cluster에 연결합니다. 연결에 대한 자세한 지침은 mongosh를 통해 연결을 참조하세요.
페이지 1 조회 및 페이지 매김 토큰 생성
샘플 쿼리는 다음 파이프라인 단계를 사용하여 첫 번째 페이지에 대한 결과를 검색하고 토큰 또는 후속 쿼리에 대한 참조 지점을 검색합니다.
결과를 10 문서로 제한합니다. | |
결과에는 문서의
|
db.movies.aggregate([ { "$search": { "index": "pagination-tutorial", "text": { "path": "title", "query": "summer" }, "sort": { "released": 1 } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "released": 1, "genres": 1, "paginationToken" : { "$meta" : "searchSequenceToken" }, "score": { "$meta": "searchScore" } } } ])
[ { genres: [ 'Drama' ], title: "A Summer at Grandpa's", paginationToken: 'CKUdGgJgAA==', score: 2.262615203857422 }, { genres: [ 'Musical', 'Romance' ], title: 'Summer Stock', released: ISODate('1951-01-22T00:00:00.000Z'), paginationToken: 'CJsFGgkpAHw/0HT///8=', score: 3.000213623046875 }, { genres: [ 'Comedy', 'Romance' ], title: 'Smiles of a Summer Night', released: ISODate('1957-12-23T00:00:00.000Z'), paginationToken: 'CKIHGgkpAKDlpaf///8=', score: 2.0149309635162354 }, { genres: [ 'Drama' ], title: 'Violent Summer', released: ISODate('1959-11-13T00:00:00.000Z'), paginationToken: 'CI8JGgkpAJhJh7X///8=', score: 3.000213623046875 }, { genres: [ 'Drama', 'Romance' ], title: 'A Summer Place', released: ISODate('1959-11-18T00:00:00.000Z'), paginationToken: 'CLoJGgkpAGQJobX///8=', score: 2.579726457595825 }, { genres: [ 'Drama' ], title: 'The End of Summer', released: ISODate('1962-02-01T00:00:00.000Z'), paginationToken: 'CK0KGgkpAAzP18X///8=', score: 2.262615203857422 }, { genres: [ 'Drama', 'Romance' ], title: 'Summer and Smoke', released: ISODate('1962-04-01T00:00:00.000Z'), paginationToken: 'CMQKGgkpAECmB8f///8=', score: 2.579726457595825 }, { genres: [ 'Documentary', 'Sport' ], title: 'The Endless Summer', released: ISODate('1968-08-17T00:00:00.000Z'), paginationToken: 'CO4MGgkpAJjH5vX///8=', score: 2.579726457595825 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: "Summer of '42", released: ISODate('1971-04-09T00:00:00.000Z'), paginationToken: 'CPQQGgkpAGRgUAkAAAA=', score: 2.579726457595825 }, { genres: [ 'Drama' ], title: 'That Certain Summer', released: ISODate('1972-11-01T00:00:00.000Z'), paginationToken: 'COwRGgkpAPQV0hQAAAA=', score: 2.579726457595825 } ]
Retrieve Page 2 Using searchAfter
추가 결과를 검색하려면 결과를 검색할 참조 지점을 지정합니다. 이 쿼리는 애플리케이션에서 '다음 페이지'와 같은 함수를 작성하기 위해 결과를 검색하는 방법을 보여줍니다.
샘플 쿼리는 다음 파이프라인 단계를 사용하여 동일한 용어에 대한 이전 쿼리에서 searchSequenceToken
에 의해 생성된 토큰을 사용하여 두 번째 페이지의 결과를 조회합니다.
| |
결과를 10 문서로 제한합니다. | |
결과에는 문서의
|
db.movies.aggregate([ { "$search": { "index": "pagination-tutorial", "text": { "path": "title", "query": "summer" }, "searchAfter": "COwRGgkpAPQV0hQAAAA=", "sort": { "released": 1 } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "released": 1, "genres": 1, "paginationToken" : { "$meta" : "searchSequenceToken" }, "score": { "$meta": "searchScore" } } } ])
[ { genres: [ 'Drama' ], title: 'Summer Wishes, Winter Dreams', released: ISODate('1974-09-09T00:00:00.000Z'), paginationToken: 'CMwSGgkpAECHcCIAAAA=', score: 2.262615203857422 }, { genres: [ 'Drama', 'Thriller' ], title: 'Shadows of a Hot Summer', released: ISODate('1978-09-01T00:00:00.000Z'), paginationToken: 'CPEVGgkpAGw/qz8AAAA=', score: 2.0149309635162354 }, { genres: [ 'Drama' ], title: 'Indian Summer', released: ISODate('1978-11-01T00:00:00.000Z'), paginationToken: 'CNYRGgkpAFhj5UAAAAA=', score: 3.000213623046875 }, { genres: [ 'Drama' ], title: 'Indian Summer', released: ISODate('1978-11-01T00:00:00.000Z'), paginationToken: 'CNsRGgkpAFhj5UAAAAA=', score: 3.000213623046875 }, { genres: [ 'Drama', 'Mystery' ], title: 'One Deadly Summer', released: ISODate('1983-05-11T00:00:00.000Z'), paginationToken: 'COwcGgkpAAjtIGIAAAA=', score: 2.579726457595825 }, { genres: [ 'Comedy' ], title: 'Summer Rental', released: ISODate('1985-08-09T00:00:00.000Z'), paginationToken: 'CL8fGgkpABTypHIAAAA=', score: 3.000213623046875 }, { genres: [ 'Drama', 'Romance' ], title: 'Summer', released: ISODate('1986-08-29T00:00:00.000Z'), paginationToken: 'CO0gGgkpAHCiY3oAAAA=', score: 3.5844719409942627 }, { genres: [ 'Drama', 'Thriller' ], title: 'Summer Camp Nightmare', released: ISODate('1987-04-17T00:00:00.000Z'), paginationToken: 'CNkiGgkpAHQ/CX8AAAA=', score: 2.579726457595825 }, { genres: [ 'Action', 'Crime', 'Drama' ], title: 'Cold Summer of 1953', released: ISODate('1988-06-01T00:00:00.000Z'), paginationToken: 'CNsjGgkpACjVTYcAAAA=', score: 2.262615203857422 }, { genres: [ 'Drama', 'War' ], title: 'That Summer of White Roses', released: ISODate('1989-07-11T00:00:00.000Z'), paginationToken: 'CI0mGgkpALSEc48AAAA=', score: 2.0149309635162354 } ]
다음을 사용하여 1페이지로 돌아가기 searchBefore
이전 결과를 검색하려면 결과를 검색하기 전에 검색할 참조 지점을 지정합니다. 이 쿼리는 애플리케이션에서 '이전 페이지'와 같은 함수를 작성하기 위해 결과를 검색하는 방법을 보여줍니다.
샘플 쿼리는 다음 파이프라인 단계를 사용하여 동일한 용어에 대한 이전 쿼리에서 searchSequenceToken
으로 생성된 토큰을 사용하여 두 번째 페이지의 결과를 검색합니다.
| |
결과를 10 문서로 제한합니다. | |
결과에는 문서의
|
참고
기본적으로 Atlas Search는 참조 지점 이전에 결과를 조회하기 위해 토큰을 지정한 쿼리에 대해 결과를 역순으로 반환합니다. 문서를 순서대로 반환하기 위해 쿼리는 toArray() 및 JavaScript reverse()
메서드를 사용합니다.
db.movies.aggregate([ { "$search": { "index": "pagination-tutorial", "text": { "path": "title", "query": "summer" }, "searchBefore": "CMwSGgkpAECHcCIAAAA=", "sort": { "released": 1 } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "released": 1, "genres": 1, "paginationToken" : { "$meta" : "searchSequenceToken" }, "score": { "$meta": "searchScore" } } } ]).toArray().reverse()
[ { genres: [ 'Drama' ], title: "A Summer at Grandpa's", paginationToken: 'CKUdGgJgAA==', score: 2.262615203857422 }, { genres: [ 'Musical', 'Romance' ], title: 'Summer Stock', released: ISODate('1951-01-22T00:00:00.000Z'), paginationToken: 'CJsFGgkpAHw/0HT///8=', score: 3.000213623046875 }, { genres: [ 'Comedy', 'Romance' ], title: 'Smiles of a Summer Night', released: ISODate('1957-12-23T00:00:00.000Z'), paginationToken: 'CKIHGgkpAKDlpaf///8=', score: 2.0149309635162354 }, { genres: [ 'Drama' ], title: 'Violent Summer', released: ISODate('1959-11-13T00:00:00.000Z'), paginationToken: 'CI8JGgkpAJhJh7X///8=', score: 3.000213623046875 }, { genres: [ 'Drama', 'Romance' ], title: 'A Summer Place', released: ISODate('1959-11-18T00:00:00.000Z'), paginationToken: 'CLoJGgkpAGQJobX///8=', score: 2.579726457595825 }, { genres: [ 'Drama' ], title: 'The End of Summer', released: ISODate('1962-02-01T00:00:00.000Z'), paginationToken: 'CK0KGgkpAAzP18X///8=', score: 2.262615203857422 }, { genres: [ 'Drama', 'Romance' ], title: 'Summer and Smoke', released: ISODate('1962-04-01T00:00:00.000Z'), paginationToken: 'CMQKGgkpAECmB8f///8=', score: 2.579726457595825 }, { genres: [ 'Documentary', 'Sport' ], title: 'The Endless Summer', released: ISODate('1968-08-17T00:00:00.000Z'), paginationToken: 'CO4MGgkpAJjH5vX///8=', score: 2.579726457595825 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: "Summer of '42", released: ISODate('1971-04-09T00:00:00.000Z'), paginationToken: 'CPQQGgkpAGRgUAkAAAA=', score: 2.579726457595825 }, { genres: [ 'Drama' ], title: 'That Certain Summer', released: ISODate('1972-11-01T00:00:00.000Z'), paginationToken: 'COwRGgkpAPQV0hQAAAA=', score: 2.579726457595825 } ]
및 을 사용하여 2 페이지에서 페이지로 이동 5 searchAfter
$skip
결과를 건너뛰고 2페이지에서 5페이지로 건너뛰려면 searchSequenceToken
에서 생성된 토큰을 사용하여 결과를 검색한 다음 결과에서 문서 20개를 건너뛸 참조 지점을 지정합니다. 이 쿼리는 페이지 건너뛰기를 허용하는 애플리케이션에서 함수를 작성하기 위해 결과를 검색하는 방법을 보여줍니다.
샘플 쿼리는 다음 파이프라인 단계를 사용하여 동일한 용어에 대해 이전 쿼리에서 searchSequenceToken
에 의해 생성된 토큰과 $skip
및 $limit
단계를 사용하여 5페이지의 결과로 이동합니다.
| |
searchAfter 를 사용하여 2페이지를 검색하기 위해 실행한 쿼리 결과의 20번째 문서와 관련된 토큰인 지정된 참조 지점 다음에 있는 결과의 20개의 문서를 건너뜁니다. | |
결과를 10 문서로 제한합니다. | |
결과에는 문서의
|
db.movies.aggregate([ { "$search": { "index": "pagination-tutorial", "text": { "path": "title", "query": "summer" }, "searchAfter": "COwRGgkpAPQV0hQAAAA=", "sort": { "released": 1 } } }, { "$skip": 20 }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "released": 1, "genres": 1, "paginationToken" : { "$meta" : "searchSequenceToken" }, "score": { "$meta": "searchScore" } } } ])
[ { genres: [ 'Drama' ], title: 'A Storm in Summer', released: ISODate('2000-02-27T00:00:00.000Z'), paginationToken: 'CO5FGgkpAChakN0AAAA=', score: 2.262615203857422 }, { genres: [ 'Comedy', 'Romance' ], title: 'Wet Hot American Summer', released: ISODate('2002-04-11T00:00:00.000Z'), paginationToken: 'CKtIGgkpAFBUIu0AAAA=', score: 2.262615203857422 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'Summer Things', released: ISODate('2002-10-09T00:00:00.000Z'), paginationToken: 'CIpPGgkpAFxzxvAAAAA=', score: 3.000213623046875 }, { genres: [ 'Adventure', 'Drama', 'Family' ], title: 'Wolf Summer', released: ISODate('2003-02-28T00:00:00.000Z'), paginationToken: 'COZWGgkpAGS6ofMAAAA=', score: 3.000213623046875 }, { genres: [ 'Animation', 'Adventure' ], title: 'Nasu: Summer in Andalusia', released: ISODate('2003-06-26T00:00:00.000Z'), paginationToken: 'CNlaGgkpAMxoAfYAAAA=', score: 2.262615203857422 }, { genres: [ 'Drama' ], title: 'Spring, Summer, Fall, Winter... and Spring', released: ISODate('2004-05-28T00:00:00.000Z'), paginationToken: 'CJ5ZGgkpAOjnyPwAAAA=', score: 1.8161234855651855 }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'Summer Storm', released: ISODate('2004-09-02T00:00:00.000Z'), paginationToken: 'CMVfGgkpAMRwvP4AAAA=', score: 3.000213623046875 }, { genres: [ 'Drama' ], title: 'Summer in the Golden Valley', released: ISODate('2004-10-08T00:00:00.000Z'), paginationToken: 'CNNWGgkpALTVdf8AAAA=', score: 2.0149309635162354 }, { genres: [ 'Drama', 'Romance' ], title: 'My Summer of Love', released: ISODate('2005-07-01T00:00:00.000Z'), paginationToken: 'CL5aGgkpAEyxzwQBAAA=', score: 2.262615203857422 }, { genres: [ 'Drama' ], title: 'Summer in Berlin', released: ISODate('2006-01-05T00:00:00.000Z'), paginationToken: 'CPZmGgkpANzclwgBAAA=', score: 2.579726457595825 } ]
페이지화된 결과에 패싯 사용
이 섹션에서는 searchSequenceToken
을 Atlas Search 패싯과 함께 사용하는 방법을 보여줍니다.
샘플 쿼리는 다음 파이프라인 단계를 사용합니다:
| |
searchSequenceToken 옵션을 사용하여 생성된 결과에 각 문서의 토큰을 저장하기 위해 paginationToken 필드를 추가합니다. | |
결과를 10 문서로 제한합니다. | |
다음과 같은 필드를 반환합니다.
|
db.movies.aggregate([ { "$search": { "index": "pagination-tutorial", "facet": { "operator": { "text": { "path": "title", "query": "summer" } }, "facets": { "genresFacet": { "type": "string", "path": "genres" } } } } }, { "$addFields": { "paginationToken" : { "$meta" : "searchSequenceToken" } } }, { "$limit": 10 }, { "$facet": { "docs": [ { "$project": { "_id": 0, "title": 1, "released": 1, "genres": 1, "paginationToken" : 1 } } ], "meta": [ { "$replaceWith": "$$SEARCH_META" }, { "$limit": 1 } ] } }, { "$set": { "meta": { "$arrayElemAt": ["$meta", 0] } } } ])
[ { docs: [ { genres: [ 'Drama', 'Romance' ], title: 'Summer', released: ISODate('1986-08-29T00:00:00.000Z'), paginationToken: 'CO0gFf1nZUA=' }, { genres: [ 'Musical', 'Romance' ], title: 'Summer Stock', released: ISODate('1951-01-22T00:00:00.000Z'), paginationToken: 'CJsFFYADQEA=' }, { genres: [ 'Drama' ], title: 'Violent Summer', released: ISODate('1959-11-13T00:00:00.000Z'), paginationToken: 'CI8JFYADQEA=' }, { genres: [ 'Drama' ], title: 'Indian Summer', released: ISODate('1978-11-01T00:00:00.000Z'), paginationToken: 'CNYRFYADQEA=' }, { genres: [ 'Drama' ], title: 'Indian Summer', released: ISODate('1978-11-01T00:00:00.000Z'), paginationToken: 'CNsRFYADQEA=' }, { genres: [ 'Comedy' ], title: 'Summer Rental', released: ISODate('1985-08-09T00:00:00.000Z'), paginationToken: 'CL8fFYADQEA=' }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'Summer Things', released: ISODate('2002-10-09T00:00:00.000Z'), paginationToken: 'CIpPFYADQEA=' }, { genres: [ 'Adventure', 'Drama', 'Family' ], title: 'Wolf Summer', released: ISODate('2003-02-28T00:00:00.000Z'), paginationToken: 'COZWFYADQEA=' }, { genres: [ 'Comedy', 'Drama', 'Romance' ], title: 'Summer Storm', released: ISODate('2004-09-02T00:00:00.000Z'), paginationToken: 'CMVfFYADQEA=' }, { genres: [ 'Drama', 'Romance' ], title: 'Summer Palace', released: ISODate('2007-04-18T00:00:00.000Z'), paginationToken: 'CIRrFYADQEA=' } ], meta: { count: { lowerBound: Long('65') }, facet: { genresFacet: { buckets: [ { _id: 'Drama', count: Long('48') }, { _id: 'Romance', count: Long('20') }, { _id: 'Comedy', count: Long('19') }, { _id: 'Family', count: Long('7') }, { _id: 'Adventure', count: Long('5') }, { _id: 'Crime', count: Long('5') }, { _id: 'Mystery', count: Long('5') }, { _id: 'Thriller', count: Long('5') }, { _id: 'Horror', count: Long('4') }, { _id: 'Action', count: Long('3') } ] } } } } ]