当我将 DynamoDB 与 AWS AppSync 配合使用时,为什么我的列表查询返回的项目数不正确?

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 进行分页,请在 GraphQL 查询中添加 nextToken 参数。

示例查询:

query MyQuery {
  listEmployees{
    items {
      id
      name
      company
    }
    nextToken
  }
}

注意:查询返回的 nextToken 值要么是,要么是以 ey 开头并以 = 结尾的长字符串。此值表示最后评估的密钥。如果该值为,则表中没有其他要评估的项目。如果它是一个长字符串,那么还有更多项目需要评估。

例如:

"nextToken": "eyJ2ZXJzaW9uIjoyLCJ0b2tlbiI6IkFRSUNBSGg5OUIvN3BjWU41eE96NDZJMW5GeGM4WUNGeG1acmFOMUpqajZLWkFDQ25BRkQxUjREaVVxMkd1aDZNZ2ZTMmhPMUFBQUNIVENDQWhrR0NTcUdTSWIzRFFFSEJxQ0NBZ293Z2dJR0FnRUFNSUlCL3dZSktvWklodmNOQVFjQk1CNEdDV0NHU0FGbEF3UUJMakFSQkF4c0RFY1ZZUGpaRDFxbDcxNENBUkNBZ2dIUWkwaGtJYytoU04vRFMzL3VQT2ZDMnpIV1dBVkg4LzU3TWFwMGZWSHVackt1VmV4emRvTVQrNml6VC9RdDRsSVNGN1pmc3NWTHVvcnJpRE1RZVE5ckNyd3J4dmNOY3ZZUzhTc21PRFFkaTUreVhQcDJ1OENaK29Sd2wrV3VoOGJ0YlBpQXQydjRNdmw2L09jRzRHV2RxRmFjeTFDRjRyK2FPd29velRTV3NqMTd4OUpwVi93cHVYc2tTN2R5TmYxa3JJS3hSL3BMWlY5M3JPSlVocEpDV2xEL3Y1UU5JdGJoOWpyaTI3N09LbUZsVlh3bDRna3hDa1kzeGZMNjZrM2dZY0hpbHlUOE1GUnBLU0VCTFE3RGEzSlJtUG8xUkJvQ051K3dBTkwwd09Vckp0N1BFb0QvTVRrenZDV1lCTXhVaUhaRDdrM3Y5a2FJS2NScHY0ajhuTDJ2Nk9EZ3plTjgwN1RtRFViM21rRUsrakRRcjUvd3ZQVW56cGFaN1RnR21yT21FaTlGQklOUnl6dk9rdDRWazZEaVU3RCtNYUJSdm5iNnR0VklPa2lDdFlhODRqenhlOFlFRUZGOElyTksrQm9yL28vdktxMVczSUxsU1VWWFd0N0hPWjV4TDBudHVTeGlBdW9ZK1Y0NEkzMXlPQkJ1T1AwMVpUek1TdGUvZCtIT1RRUEt2SGVGanF5Y0tpNGNTQUdZN3BobGs5eWJJem9hOTM0YldJOUFyRmF0WDY4UnkzTkF4cWNCbzh4ZklxZGZNN3Rlam02NldMT0Z6T3F6MDRrK1B0K0lXdWhOeS9CWEN2YXh2dk09In0="

要获取表中的其余项目,请使用 nextToken 作为查询变量运行另一个查询。继续包含 nextToken 变量,直到评估所有项目。

示例查询:

query MyQuery {
  listEmployees(nextToken:"eyJ......="){
    items {
      id
      name
      company
    }
    nextToken
  }
}

为数据编制索引

在以下示例查询中,筛选条件表达式设置为返回基于等于 AnyComany 的员工的项目数:

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 Major5 个项目。但是,可能有 5 个以上的 Mary Major。

**注意:**索引查询一次最多返回 1 MB 的数据。对于较大的索引查询,可以使用分页。


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