결과 페이지 매김
이 페이지의 내용
MongoDB 6.0.13+ 또는 7.0.5+ 버전을 실행하는 Atlas 클러스터에서 Atlas Search를 사용하면 참조 지점 뒤나 앞에서 $search
쿼리 결과를 순차적으로 조회할 수 있습니다. $search
searchAfter
또는 searchBefore
옵션을 사용하여 결과를 순서대로 탐색하고 애플리케이션에서 '다음 페이지' 및 '이전 페이지' 기능을 빌드합니다.
사용법
페이지가 매겨진 결과를 조회하려면 다음 단계를 수행하세요.
쿼리하려는 필드에 대한 인덱스를 만듭니다.
후속
$search
쿼리에서 참조 지점을 사용하여 결과의 다음 또는 이전 문서 세트를 검색합니다.'다음 페이지' 함수를 빌드하기 위한 결과 검색에 대해 자세히 알아보려면 특정 기준점 이후 Atlas 검색을 참조하세요.
'이전 페이지' 함수를 빌드하기 위한 결과 검색에 대해 자세히 알아보려면 특정 참조 지점 전 Atlas 검색을 참조하세요.
결과의 특정 페이지로 이동하려면
$skip
및$limit
를$search
searchAfter
또는searchBefore
옵션과 결합하세요. 예를 들어, 페이지 3에서 페이지 5로 이동하고 페이지당 10개의 결과를 표시하려면 다음을 수행하세요.3 페이지의 마지막 결과에 대한 기준점과 함께
searchAfter
을 사용하여 결과를 조회합니다(결과 30).$skip
를 사용하여 4 페이지의 10 개 결과(결과 31-40)를 건너뛰고$limit
를 사용하여 결과를 10 문서로 제한합니다.5 페이지에 대한 결과를 반환합니다. (결과 41-50)
여기서
searchAfter
옵션과 함께$skip
을 사용하면 1개 페이지의 결과(10개 문서)만 건너뛰도록 쿼리를 최적화합니다. 이에 반해,$search
searchAfter
옵션 없이$skip
을 사용하면 쿼리는 4개 페이지의 결과(40개 문서)를 건너뜁니다. 자세한 내용은searchAfter
및$skip
을 사용하여 2페이지에서 5페이지로 이동을 참조하세요.
고려 사항
여러 문서에 동일한 값이 있는 필드 를 정렬하면 타이가 발생합니다. MongoDB 동점인 쿼리 결과의 순서를 보장하지 않으므로 searchAfter
및 searchBefore
를 사용할 때 중복과 불일치가 발생할 수 있습니다. 결정론적 검색 동작을 보장하려면 다음 원칙을 적용하세요.
관련성 점수가 동점인 것을 방지하려면 고유한 필드 기준으로 쿼리 정렬합니다.
고유하지 않은 필드 기준으로 주로 정렬하려면 고유 필드 에 세컨더리 정렬 절을 추가하여 순위 결정자 제공 .
변경할 수 없는 필드 기준으로 쿼리 결과를 정렬합니다. Atlas Search 초기 쿼리와 후속 쿼리 사이에 컬렉션 에 수행한 업데이트를 반영합니다.
updated_time
와(과) 같이 변경 가능한 필드 기준으로 정렬하고 첫 번째 쿼리와 두 번째 쿼리 사이에 컬렉션 업데이트 경우, Atlas Search 동일한 문서를 다르게 정렬할 수 있습니다.
변경할 수 없는 필드나 고유한 필드를 기준으로 쿼리 결과를 정렬하는 방법을 알아보려면 Atlas Search 결과 정렬을 참조하세요.
기준점 조회
특정 지점의 쿼리 결과를 검색하려면 $search
쿼리에서 참조 지점을 제공해야 합니다. $search
단계 이후의 $project
단계에서 $meta
키워드 searchSequenceToken
을 사용하여 참조 지점을 검색할 수 있습니다.
구문
1 [{ 2 "$search": { 3 "index": "<index-name>", 4 "<operator-name>"|"<collector-name>": { 5 <operator-specification>|<collector-specification> 6 } 7 "sort": { 8 "score": { 9 "$meta": "searchScore", _id:1 10 } 11 } 12 ... 13 }, 14 { 15 "$project": { 16 { "paginationToken" : { "$meta" : "searchSequenceToken" } } 17 }, 18 ... 19 }]
출력
searchSequenceToken
은 결과의 각 문서에 대해 기본64인코딩된 토큰을 생성합니다. 토큰의 길이는 쿼리의 정렬 옵션에 지정된 필드 수에 따라 늘어납니다. 토큰은 데이터베이스의 스냅샷에 연결되지 않습니다.
결과의 문서는 기본 순서로 정렬되며 쿼리에서 sort
옵션을 지정하지 않는 한 기본 순서를 따릅니다. 결과 정렬에 대해 자세히 알아보려면 Atlas 검색 결과 정렬을 참조하세요.
특정 참조 지점 후 Atlas Search
참조 지점 이후를 검색하려면 $search
쿼리에서 searchAfter
옵션과 searchSequenceToken
으로 생성된 토큰을 사용하여 참조 지점을 지정해야 합니다. searchSequenceToken
에서 생성된 토큰은 searchSequenceToken
토큰을 생성한 $search
쿼리를 다시 실행할 때만 사용할 수 있습니다. 토큰을 사용하는 후속 $search
쿼리의 의미(검색 필드 및 값)는 searchSequenceToken
이 토큰을 생성한 쿼리와 동일해야 합니다.
searchAfter
옵션을 사용하여 애플리케이션에서 '다음 페이지' 함수를 빌드할 수 있습니다. 이에 대한 데모는 이 페이지의 예제 를 참조하세요.
searchAfter
구문
1 { 2 "$search": { 3 "index": "<index-name>", 4 "<operator-name>"|"<collector-name>": { 5 <operator-specification>|<collector-specification> 6 }, 7 "searchAfter": "<base64-encoded-token>", 8 "sort": { 9 "score": { 10 "$meta": "searchScore", _id:1 11 } 12 } 13 ... 14 }, 15 "$project": { 16 { "paginationToken" : { "$meta" : "searchSequenceToken" } } 17 }, 18 ... 19 }
출력
Atlas Search는 지정된 토큰 이후의 결과에서 문서를 반환합니다. 단계 이후의 단계에서 줄에 표시된 대로 searchSequenceToken
$project
$search
11을(를) 지정했기 때문에 Atlas Search는 결과에서 문서에 대해 생성된 토큰을 반환합니다. 이러한 토큰은 동일한 의미 체계를 가진 다른 쿼리의 기준점으로 사용할 수 있습니다.
결과의 문서는 기본 순서로 정렬되며 쿼리에서 sort
옵션을 지정하지 않는 한 기본 순서를 따릅니다. 결과 정렬에 대해 자세히 알아보려면 Atlas 검색 결과 정렬을 참조하세요.
특정 참조 지점 이전 Atlas Search
기준점 앞에서 Atlas Search를 하려면 searchSequenceToken
에 의해 생성된 토큰과 함께 searchBefore
옵션을 사용하여 $search
쿼리에서 기준점을 지정해야 합니다. searchSequenceToken
이(가) 토큰을 생성한 $search
쿼리를 다시 실행하는 경우에만 searchSequenceToken
에서 생성된 토큰을 사용할 수 있습니다. 토큰을 사용하는 후속 $search
쿼리의 시맨틱(Atlas Search 필드 및 값)은 searchSequenceToken
토큰을 생성한 쿼리와 동일해야 합니다.
searchBefore
옵션을 사용하여 애플리케이션에서 '이전 페이지' 함수를 빌드할 수 있습니다. '이전 페이지' 함수를 빌드하려면 다음을 결합합니다.
이에 대한 데모는 이 페이지의 searchBefore
쿼리 예제 를 참조하세요.
searchBefore
구문
1 { 2 "$search": { 3 "index": "<index-name>", 4 "<operator-name>"|"<collector-name>": { 5 <operator-specification>|<collector-specification> 6 }, 7 "searchBefore": "<base64-encoded-token>", 8 "sort": { 9 "score": { 10 "$meta": "searchScore", _id:1 11 } 12 } 13 ... 14 }, 15 "$project": { 16 { "paginationToken" : { "$meta" : "searchSequenceToken" } } 17 }, 18 ... 19 }
searchBefore
출력
Atlas Search는 지정된 토큰 앞의 결과에서 문서를 역순으로 반환합니다. 또한 $search
단계 이후의 $project
단계에서 searchSequenceToken
을 지정했기 때문에 Atlas Search는 결과에 있는 문서에 대해 생성된 토큰도 반환합니다(11 행 참조). 이러한 토큰은 동일한 의미 체계를 가진 다른 쿼리의 참조 지점으로 사용될 수 있습니다.
예시
다음 예시에서는 동적 매핑을 사용하는 default
라는 이름의 Atlas Search 인덱스가 있는 sample-mflix.movies 컬렉션을 사용합니다. 컬렉션을 로드하고 인덱스를 생성하면 컬렉션에 대해 다음 쿼리를 실행할 수 있습니다.
searchSequenceToken
쿼리
다음 쿼리는 다음 파이프라인 단계를 사용합니다.
$search
다음을 수행합니다.컬렉션의
title
필드에서war
라는 텀을 Atlas Search합니다.점수가 동일한 문서에 대해 먼저 점수별로 결과를 정렬한 다음
released
필드 값을 기준으로 오름차순으로 정렬합니다.
$limit
단계를 실행하여 결과를10
문서로 제한합니다.$project
단계를 사용하여 다음을 수행합니다.title
및released
필드만 포함합니다.다음 필드를 추가합니다.
각 문서에 대한 Base64 인코딩 토큰을 포함하는
paginationToken
필드입니다.각 문서의 관련성 점수가 포함된
score
필드입니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": "title", 6 "query": "war" 7 }, 8 "sort": {score: {$meta: "searchScore"}, "released": 1} 9 } 10 }, 11 { 12 "$limit": 10 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1, 18 "released": 1, 19 "paginationToken" : { "$meta" : "searchSequenceToken" }, 20 "score": {$meta: "searchScore"} 21 } 22 } 23 ])
1 [ 2 { 3 title: 'War', 4 released: ISODate('2002-03-14T00:00:00.000Z'), 5 paginationToken: 'CMFRGgYQup3BhQgaCSkAQCKS7AAAAA==', 6 score: 3.3774025440216064 7 }, 8 { 9 title: 'War', 10 released: ISODate('2014-09-21T00:00:00.000Z'), 11 paginationToken: 'CMelARoGELqdwYUIGgkpAAiClUgBAAA=', 12 score: 3.3774025440216064 13 }, 14 { 15 title: 'War Photographer', 16 paginationToken: 'CMBRGgYQuq+ngwgaAmAA', 17 score: 2.8268959522247314 18 }, 19 { 20 title: "Troma's War", 21 released: ISODate('1989-11-18T00:00:00.000Z'), 22 paginationToken: 'CL8kGgYQuq+ngwgaCSkAbP8QkgAAAA==', 23 score: 2.8268959522247314 24 }, 25 { 26 title: 'The War', 27 released: ISODate('1994-11-04T00:00:00.000Z'), 28 paginationToken: 'CI0wGgYQuq+ngwgaCSkAnIKEtgAAAA==', 29 score: 2.8268959522247314 30 }, 31 { 32 title: 'War Stories', 33 released: ISODate('1996-05-09T00:00:00.000Z'), 34 paginationToken: 'CPIyGgYQuq+ngwgaCSkA/DifwQAAAA==', 35 score: 2.8268959522247314 36 }, 37 { 38 title: "Gaston's War", 39 released: ISODate('1997-10-23T00:00:00.000Z'), 40 paginationToken: 'CMQ7GgYQuq+ngwgaCSkALPBSzAAAAA==', 41 score: 2.8268959522247314 42 }, 43 { 44 title: 'Shooting War', 45 released: ISODate('2000-12-07T00:00:00.000Z'), 46 paginationToken: 'CMJJGgYQuq+ngwgaCSkAOOhG4wAAAA==', 47 score: 2.8268959522247314 48 }, 49 { 50 title: "Varian's War", 51 released: ISODate('2001-04-22T00:00:00.000Z'), 52 paginationToken: 'CM5IGgYQuq+ngwgaCSkAGEkD5gAAAA==', 53 score: 2.8268959522247314 54 }, 55 { 56 title: "Hart's War", 57 released: ISODate('2002-02-15T00:00:00.000Z'), 58 paginationToken: 'CMtJGgYQuq+ngwgaCSkAjBYH7AAAAA==', 59 score: 2.8268959522247314 60 } 61 ]
참고
결과에 포함된 문서의 토큰은 다를 수 있습니다. 후속 쿼리 의 토큰을 searchAfter
또는 searchBefore
쿼리를 실행하기 전에 Atlas Search가 결과에서 반환한 토큰으로 바꿉니다.
후속 searchAfter
및 searchBefore
쿼리
다음 쿼리는 동일한 시맨틱을 가진 다른 쿼리의 토큰을 사용하여 지정된 토큰 이후 또는 이전에 페이지가 매겨진 결과를 검색합니다. 예제 searchSequenceToken
쿼리 를 실행한 경우 결과에 표시되는 문서의 토큰이 다를 수 있습니다. 이 섹션의 쿼리에 있는 토큰을 쿼리 결과에 반환된 토큰으로 바꿔야 합니다.
쿼리는 다음 파이프라인 단계를 사용합니다.
$search
단계를 사용하여 다음을 수행합니다.Atlas Search 결과에서
title
필드의war
용어에 대한 문서를 검색합니다.점수가 동일한 문서에 대해 먼저 점수별로 결과를 정렬한 다음
released
필드 값을 기준으로 오름차순으로 정렬합니다.
$limit
단계를 실행하여 결과를10
문서로 제한합니다.$project
단계를 사용하여 다음을 수행합니다.문서에
title
및released
필드만 포함합니다.다음 필드를 추가합니다.
각 문서에 대한 Base64 인코딩 토큰을 포함하는
paginationToken
필드입니다.각 문서의 관련성 점수가 포함된
score
필드입니다.
기준점 이후 Atlas Search
다음 쿼리는 Atlas Search 결과에서 지정된 기준점 이후 title
필드의 war
이라는 용어가 포함된 문서를 요청합니다. searchSequenceToken
쿼리 결과의 마지막 문서와 연결된 토큰( 58 줄)을 기준점으로 사용하여 결과에서 다음 10
문서를 검색합니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": "title", 6 "query": "war" 7 }, 8 "sort": {score: {$meta: "searchScore"}, "released": 1}, 9 "searchAfter": "CMtJGgYQuq+ngwgaCSkAjBYH7AAAAA==" 10 } 11 }, 12 { 13 "$limit": 10 14 }, 15 { 16 "$project": { 17 "_id": 0, 18 "title": 1, 19 "released": 1, 20 "paginationToken" : { "$meta" : "searchSequenceToken" }, 21 "score": { "$meta": "searchScore" } 22 } 23 } 24 ])
1 [ 2 { 3 title: 'The War', 4 released: ISODate('2007-09-23T00:00:00.000Z'), 5 paginationToken: 'CP9xGgYQuq+ngwgaCSkA1KkvFQEAAA==', 6 score: 2.8268959522247314 7 }, 8 { 9 title: 'War, Inc.', 10 released: ISODate('2008-06-13T00:00:00.000Z'), 11 paginationToken: 'COhuGgYQuq+ngwgaCSkAtDh/GgEAAA==', 12 score: 2.8268959522247314 13 }, 14 { 15 title: 'War, Inc.', 16 released: ISODate('2008-06-13T00:00:00.000Z'), 17 paginationToken: 'COluGgYQuq+ngwgaCSkAtDh/GgEAAA==', 18 score: 2.8268959522247314 19 }, 20 { 21 title: 'War Dance', 22 released: ISODate('2008-11-01T00:00:00.000Z'), 23 paginationToken: 'CONvGgYQuq+ngwgaCSkAYFlVHQEAAA==', 24 score: 2.8268959522247314 25 }, 26 { 27 title: 'War Horse', 28 released: ISODate('2011-12-25T00:00:00.000Z'), 29 paginationToken: 'CJWFARoGELqvp4MIGgkpAEyEcjQBAAA=', 30 score: 2.8268959522247314 31 }, 32 { 33 title: 'Cold War', 34 released: ISODate('2012-11-08T00:00:00.000Z'), 35 paginationToken: 'CJGUARoGELqvp4MIGgkpAPBQ3ToBAAA=', 36 score: 2.8268959522247314 37 }, 38 { 39 title: 'Drug War', 40 released: ISODate('2013-04-04T00:00:00.000Z'), 41 paginationToken: 'CMWTARoGELqvp4MIGgkpAMRX0j0BAAA=', 42 score: 2.8268959522247314 43 }, 44 { 45 title: 'War Story', 46 released: ISODate('2014-07-30T00:00:00.000Z'), 47 paginationToken: 'CJCdARoGELqvp4MIGgkpAPyQhEcBAAA=', 48 score: 2.8268959522247314 49 }, 50 { 51 title: 'A War', 52 released: ISODate('2015-09-10T00:00:00.000Z'), 53 paginationToken: 'CL2kARoGELqvp4MIGgkpAECNtE8BAAA=', 54 score: 2.8268959522247314 55 }, 56 { 57 title: 'War Pigs', 58 released: ISODate('2015-09-18T00:00:00.000Z'), 59 paginationToken: 'CJ6kARoGELqvp4MIGgkpACDA3U8BAAA=', 60 score: 2.8268959522247314 61 } 62 ]
기준점 이전 Atlas Search
다음 쿼리는 지정된 참조 지점 앞의 title
필드에 있는 war
라는 텀에 대한 Atlas Search 결과를 요청합니다. 샘플 searchAfter
쿼리 결과의 마지막 문서와 연관된 토큰(59 행)을 참조 지점으로 사용하여 결과에서 이전 10
문서를 조회합니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": "title", 6 "query": "war" 7 }, 8 "sort": {score: {$meta: "searchScore"}, "released": 1}, 9 "searchBefore": "CJ6kARoGELqvp4MIGgkpACDA3U8BAAA=" 10 } 11 }, 12 { 13 "$limit": 10 14 }, 15 { 16 "$project": { 17 "_id": 0, 18 "title": 1, 19 "released": 1, 20 "paginationToken" : { "$meta" : "searchSequenceToken" }, 21 "score": { "$meta": "searchScore" } 22 } 23 } 24 ])
1 [ 2 { 3 title: 'A War', 4 released: ISODate('2015-09-10T00:00:00.000Z'), 5 paginationToken: 'CL2kARoGELqvp4MIGgkpAECNtE8BAAA=', 6 score: 2.8268959522247314 7 }, 8 { 9 title: 'War Story', 10 released: ISODate('2014-07-30T00:00:00.000Z'), 11 paginationToken: 'CJCdARoGELqvp4MIGgkpAPyQhEcBAAA=', 12 score: 2.8268959522247314 13 }, 14 { 15 title: 'Drug War', 16 released: ISODate('2013-04-04T00:00:00.000Z'), 17 paginationToken: 'CMWTARoGELqvp4MIGgkpAMRX0j0BAAA=', 18 score: 2.8268959522247314 19 }, 20 { 21 title: 'Cold War', 22 released: ISODate('2012-11-08T00:00:00.000Z'), 23 paginationToken: 'CJGUARoGELqvp4MIGgkpAPBQ3ToBAAA=', 24 score: 2.8268959522247314 25 }, 26 { 27 title: 'War Horse', 28 released: ISODate('2011-12-25T00:00:00.000Z'), 29 paginationToken: 'CJWFARoGELqvp4MIGgkpAEyEcjQBAAA=', 30 score: 2.8268959522247314 31 }, 32 { 33 title: 'War Dance', 34 released: ISODate('2008-11-01T00:00:00.000Z'), 35 paginationToken: 'CONvGgYQuq+ngwgaCSkAYFlVHQEAAA==', 36 score: 2.8268959522247314 37 }, 38 { 39 title: 'War, Inc.', 40 released: ISODate('2008-06-13T00:00:00.000Z'), 41 paginationToken: 'COluGgYQuq+ngwgaCSkAtDh/GgEAAA==', 42 score: 2.8268959522247314 43 }, 44 { 45 title: 'War, Inc.', 46 released: ISODate('2008-06-13T00:00:00.000Z'), 47 paginationToken: 'COhuGgYQuq+ngwgaCSkAtDh/GgEAAA==', 48 score: 2.8268959522247314 49 }, 50 { 51 title: 'The War', 52 released: ISODate('2007-09-23T00:00:00.000Z'), 53 paginationToken: 'CP9xGgYQuq+ngwgaCSkA1KkvFQEAAA==', 54 score: 2.8268959522247314 55 }, 56 { 57 title: "Hart's War", 58 released: ISODate('2002-02-15T00:00:00.000Z'), 59 paginationToken: 'CMtJGgYQuq+ngwgaCSkAjBYH7AAAAA==', 60 score: 2.8268959522247314 61 } 62 ]
앞의 쿼리의 경우 Atlas Search 결과는 역순입니다. 다음 쿼리는 $limit
단계와 toArray() 및 reverse()
메서드를 사용하여 "이전 페이지"와 유사한 함수를 빌드합니다.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": "title", 6 "query": "war" 7 }, 8 "sort": {score: {$meta: "searchScore"}, "released": 1}, 9 "searchBefore": "CJ6kARoGELqvp4MIGgkpACDA3U8BAAA=" 10 } 11 }, 12 { 13 "$limit": 10 14 }, 15 { 16 "$project": { 17 "_id": 0, 18 "title": 1, 19 "released": 1, 20 "paginationToken" : { "$meta" : "searchSequenceToken" }, 21 "score": { "$meta": "searchScore" } 22 } 23 } 24 ]).toArray().reverse()
1 [ 2 { 3 title: "Hart's War", 4 released: ISODate('2002-02-15T00:00:00.000Z'), 5 paginationToken: 'CMtJGgYQuq+ngwgaCSkAjBYH7AAAAA==', 6 score: 2.8268959522247314 7 }, 8 { 9 title: 'The War', 10 released: ISODate('2007-09-23T00:00:00.000Z'), 11 paginationToken: 'CP9xGgYQuq+ngwgaCSkA1KkvFQEAAA==', 12 score: 2.8268959522247314 13 }, 14 { 15 title: 'War, Inc.', 16 released: ISODate('2008-06-13T00:00:00.000Z'), 17 paginationToken: 'COhuGgYQuq+ngwgaCSkAtDh/GgEAAA==', 18 score: 2.8268959522247314 19 }, 20 { 21 title: 'War, Inc.', 22 released: ISODate('2008-06-13T00:00:00.000Z'), 23 paginationToken: 'COluGgYQuq+ngwgaCSkAtDh/GgEAAA==', 24 score: 2.8268959522247314 25 }, 26 { 27 title: 'War Dance', 28 released: ISODate('2008-11-01T00:00:00.000Z'), 29 paginationToken: 'CONvGgYQuq+ngwgaCSkAYFlVHQEAAA==', 30 score: 2.8268959522247314 31 }, 32 { 33 title: 'War Horse', 34 released: ISODate('2011-12-25T00:00:00.000Z'), 35 paginationToken: 'CJWFARoGELqvp4MIGgkpAEyEcjQBAAA=', 36 score: 2.8268959522247314 37 }, 38 { 39 title: 'Cold War', 40 released: ISODate('2012-11-08T00:00:00.000Z'), 41 paginationToken: 'CJGUARoGELqvp4MIGgkpAPBQ3ToBAAA=', 42 score: 2.8268959522247314 43 }, 44 { 45 title: 'Drug War', 46 released: ISODate('2013-04-04T00:00:00.000Z'), 47 paginationToken: 'CMWTARoGELqvp4MIGgkpAMRX0j0BAAA=', 48 score: 2.8268959522247314 49 }, 50 { 51 title: 'War Story', 52 released: ISODate('2014-07-30T00:00:00.000Z'), 53 paginationToken: 'CJCdARoGELqvp4MIGgkpAPyQhEcBAAA=', 54 score: 2.8268959522247314 55 }, 56 { 57 title: 'A War', 58 released: ISODate('2015-09-10T00:00:00.000Z'), 59 paginationToken: 'CL2kARoGELqvp4MIGgkpAECNtE8BAAA=', 60 score: 2.8268959522247314 61 } 62 ]