當我搭配 AWS AppSync 使用 DynamoDB 時,為什麼我的清單查詢會傳回錯誤的項目數量?

2 分的閱讀內容
0

當我將 Amazon DynamoDB 與 AWS AppSync 搭配使用時,我的清單查詢傳回錯誤的項目數量。如何解決此錯誤?

簡短描述

當您搭配 AWS AppSync 和 Amazon DynamoDB 使用清單查詢時,DynamoDB 會在資料表上執行掃描作業,並傳回特定數量的評估項目。如果您在請求上提供 FilterExpression 作業,則 DynamoDB 只會將 FilterExpression 套用至這些評估的項目。

掃描檢查的項目數取決於您套用至查詢的限制變數。如果未套用任何限制,DynamoDB 會使用請求對應範本中設定的預設限制。掃描只會傳回已評估並符合篩選運算式的項目。若要傳回預期的項目數,您必須調整限制變數。

您可以增加對應範本的預設限制,或將限制變數新增至清單 GraphQL 查詢。但是,您可以評估的最大項目數為 1 MB。如果掃描作業超過 1 MB 的資料,則可以使用分頁來取得其餘資料。為了協助您查詢包含數千個項目的資料庫,您可以索引資料,以便依公用欄位篩選結果。

解決方案

增加預設限制

在下列範例中,針對 AWS Amplify 產生的 API 的對應範本,預設限制為 100

#set( $limit = $util.defaultIfNull($context.args.limit, 100) )
#set( $ListRequest = {
  "version": "2018-05-29",
  "limit": $limit
} )

若要評估更多項目,請變更對應範本中的預設限制。或者,將限制變數新增至清單查詢。例如,在下列清單查詢中,限制設定為 1000

query MyQuery {
  listEmployees(limit: 1000) {
    items {
      id
      name
      company
    }
  }
}

使用 AWS AppSync 分頁

若要使用 AWS AppSync 進行分頁,請將 nextToken 引數新增至您的 GraphQL 查詢。

查詢範例:

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
  }
}

前面的查詢只返回 5 個等於 Mary Major 的項目。但是,可能有超過 5 個 Mary Major。

**備註:**索引查詢同樣一次最多會傳回 1 MB 的資料。對於較大的索引查詢,您可以使用分頁。


AWS 官方
AWS 官方已更新 2 年前