DynamoDB를 AWS AppSync와 함께 사용할 때 list 쿼리가 잘못된 수의 항목을 반환하는 이유는 무엇입니까?
Amazon DynamoDB를 AWS AppSync와 함께 사용할 때 list 쿼리가 잘못된 수의 항목을 반환합니다. 이 문제를 해결하려면 어떻게 해야 합니까?
간략한 설명
AWS AppSync 및 Amazon DynamoDB에서 list 쿼리를 사용하는 경우 DynamoDB는 테이블에서 Scan 작업을 수행하고 특정 개수의 평가 항목을 반환합니다. 요청에 대해 FilterExpression 작업을 제공하는 경우 DynamoDB는 이러한 평가된 항목에만 FilterExpression을 적용합니다.
Scan이 확인하는 항목 수는 쿼리에 적용한 제한 변수에 따라 다릅니다. 제한이 적용되지 않으면 DynamoDB는 요청 매핑 템플릿에 구성된 기본 제한을 사용합니다. Scan은 필터 표현식과 일치하고 평가된 항목만 반환합니다. 예상되는 항목 수를 반환하려면 제한 변수를 조정해야 합니다.
매핑 템플릿의 기본 제한을 늘리거나 list GraphQL 쿼리에 제한 변수를 추가할 수 있습니다. 하지만 평가할 수 있는 최대 항목 수는 1MB입니다. Scan 작업이 1MB를 초과하는 경우 페이지 매김을 사용하여 나머지 데이터를 가져올 수 있습니다. 수천 개의 항목이 있는 데이터베이스를 쿼리하는 데 도움이 되도록 데이터를 인덱싱하여 공통 필드로 결과를 필터링할 수 있습니다.
해결 방법
기본 제한 늘리기
AWS Amplify에서 생성된 API에 대한 다음 예제 매핑 템플릿에서 기본 제한은 100입니다.
#set( $limit = $util.defaultIfNull($context.args.limit, 100) ) #set( $ListRequest = { "version": "2018-05-29", "limit": $limit } )
추가 항목을 평가하려면 매핑 템플릿에서 기본 제한을 변경합니다. 또는 list 쿼리에 제한 변수를 추가합니다. 예를 들어 다음 list 쿼리에서 제한은 1000으로 설정됩니다.
query MyQuery { listEmployees(limit: 1000) { items { id name company } } }
AWS AppSync로 페이지 매기기
AWS AppSync로 페이지를 매기려면 GraphQL 쿼리에 nextToken 인수를 추가하십시오.
예제 쿼리:
query MyQuery { listEmployees{ items { id name company } nextToken } }
참고: 쿼리가 반환하는 nextToken 값은 null이거나 ey로 시작하고 **=**로 끝나는 긴 문자열입니다. 이 값은 마지막으로 평가된 키를 나타냅니다. 값이 null이면 테이블에 평가할 항목이 더 이상 없는 것입니다. 긴 문자열의 경우, 평가할 항목이 더 있습니다.
예:
"nextToken": "eyJ2ZXJzaW9uIjoyLCJ0b2tlbiI6IkFRSUNBSGg5OUIvN3BjWU41eE96NDZJMW5GeGM4WUNGeG1acmFOMUpqajZLWkFDQ25BRkQxUjREaVVxMkd1aDZNZ2ZTMmhPMUFBQUNIVENDQWhrR0NTcUdTSWIzRFFFSEJxQ0NBZ293Z2dJR0FnRUFNSUlCL3dZSktvWklodmNOQVFjQk1CNEdDV0NHU0FGbEF3UUJMakFSQkF4c0RFY1ZZUGpaRDFxbDcxNENBUkNBZ2dIUWkwaGtJYytoU04vRFMzL3VQT2ZDMnpIV1dBVkg4LzU3TWFwMGZWSHVackt1VmV4emRvTVQrNml6VC9RdDRsSVNGN1pmc3NWTHVvcnJpRE1RZVE5ckNyd3J4dmNOY3ZZUzhTc21PRFFkaTUreVhQcDJ1OENaK29Sd2wrV3VoOGJ0YlBpQXQydjRNdmw2L09jRzRHV2RxRmFjeTFDRjRyK2FPd29velRTV3NqMTd4OUpwVi93cHVYc2tTN2R5TmYxa3JJS3hSL3BMWlY5M3JPSlVocEpDV2xEL3Y1UU5JdGJoOWpyaTI3N09LbUZsVlh3bDRna3hDa1kzeGZMNjZrM2dZY0hpbHlUOE1GUnBLU0VCTFE3RGEzSlJtUG8xUkJvQ051K3dBTkwwd09Vckp0N1BFb0QvTVRrenZDV1lCTXhVaUhaRDdrM3Y5a2FJS2NScHY0ajhuTDJ2Nk9EZ3plTjgwN1RtRFViM21rRUsrakRRcjUvd3ZQVW56cGFaN1RnR21yT21FaTlGQklOUnl6dk9rdDRWazZEaVU3RCtNYUJSdm5iNnR0VklPa2lDdFlhODRqenhlOFlFRUZGOElyTksrQm9yL28vdktxMVczSUxsU1VWWFd0N0hPWjV4TDBudHVTeGlBdW9ZK1Y0NEkzMXlPQkJ1T1AwMVpUek1TdGUvZCtIT1RRUEt2SGVGanF5Y0tpNGNTQUdZN3BobGs5eWJJem9hOTM0YldJOUFyRmF0WDY4UnkzTkF4cWNCbzh4ZklxZGZNN3Rlam02NldMT0Z6T3F6MDRrK1B0K0lXdWhOeS9CWEN2YXh2dk09In0="
테이블의 나머지 항목을 가져오려면 nextToken을 쿼리 변수로 사용하여 다른 쿼리를 실행합니다. 모든 항목이 평가될 때까지 nextToken 변수를 계속 포함합니다.
예시 쿼리:
query MyQuery { listEmployees(nextToken:"eyJ......="){ items { id name company } nextToken } }
데이터 색인
다음 예제 쿼리에서 필터 표현식은 AnyCompany와 같은 직원을 기반으로 하는 여러 항목을 반환하도록 설정되어 있습니다.
query MyQuery { listEmployees(filter: {company: {eq: "AnyCompany"}}) { items { id name company } nextToken } }
회사를 기반으로 모든 직원을 나열하려면 쿼리할 필드에 대한 글로벌 보조 인덱스를 생성합니다. 예를 들어, Amplify에서 @index 지시문을 사용하여 보조 인덱스를 정의할 수 있습니다.
type Employee @model{ id:ID name : String email : AWSEmail company: String @index(name:"employeeByCompany", queryField: "listEmployeesByCompany") }
다음 예제 쿼리에서 GSI 회사 필드에 employeeByCompany가 설정되고 쿼리는 listEmployeesByCompany로 정의됩니다.
query MyQuery { listEmployeesByCompany(company: "AnyCompany") { items { id name company } nextToken } }
제한 변수를 지정하여 데이터베이스에서 의도한 개수의 항목을 반환할 수 있습니다. 예를 들어 다음 쿼리에서 제한 변수는 5로 설정됩니다.
query MyQuery { listEmployeesByCompany(company: "AnyCompany",limit:5) { items { id name company } nextToken } }
참고: 제한 변수를 설정하면 FilterExpressions를 추가로 적용한 경우에도 의도한 항목 수만 반환됩니다. 예를 들어 다음 쿼리에서 제한 변수는 5로 설정되고 필터는 Mary Major와 같습니다.
query MyQuery { listEmployeesByCompany(company: "AnyCompany",limit:5) { name:{ eq:"Mary Major" } }) { items { id name company } nextToken } }
위의 쿼리는 Mary Major와 동일한 5개의 항목만 반환합니다. 그러나 Mary Major는 5개 이상이 존재할 수도 있습니다.
참고: 인덱싱된 쿼리는 한 번에 최대 1MB의 데이터를 반환합니다. 인덱싱된 쿼리의 경우 페이지 매김을 사용할 수 있습니다.
관련 콘텐츠
- 질문됨 일 년 전lg...
- 질문됨 9달 전lg...
- AWS 공식업데이트됨 3년 전
- AWS 공식업데이트됨 10달 전
- AWS 공식업데이트됨 2달 전