【问题标题】:AWS AppSync GraphQL query a record by a field valueAWS AppSync GraphQL 按字段值查询记录
【发布时间】:2019-05-13 18:18:12
【问题描述】:

我有一个用户表,其中包含电子邮件、电话等,我想根据其电子邮件或电话值(而不是 #Id)查询记录。没有足够的知识来做这件事 - 我写了一个这样的模式:

type Query {
    ...
    getUser(id: ID!): User
    getUserByEmail(input: GetUserByEmailInput!): User
    ...
}
input GetUserByEmailInput {
    email: String!
}

在针对 getUserByEmail(..) 的解析器中,我尝试进行试验,但到目前为止没有任何效果,所以它保持默认状态:

所以当我向查询控制台运行这样的查询时:

query GetUserByEmail {
    getUserByEmail(input: {email: "email@email.com"}) {
      id
      name
      email
      image
    }
  }

这会返回如下错误:

{
  "data": {
    "getUserByEmail": null
  },
  "errors": [
    {
      "path": [
        "getUserByEmail"
      ],
      "data": null,
      "errorType": "DynamoDB:AmazonDynamoDBException",
      "errorInfo": null,
      "locations": [
        {
          "line": 41,
          "column": 5,
          "sourceName": null
        }
      ],
      "message": "The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: xxx)"
    }
  ]
}

如何通过非 Id 字段值查询记录?

【问题讨论】:

    标签: amazon-dynamodb graphql aws-appsync


    【解决方案1】:

    如果您在控制台中使用创建资源流,它将创建一个 listUsers 查询,例如,如下所示。请注意,DynamoDb 操作将是具有 DynamoDb 过滤器表达式的 Scan,您可以在其中使用任何字段来查询 DynamoDb。映射模板见下文。

    {
      "version": "2017-02-28",
      "operation": "Scan",
      "filter": #if($context.args.filter) $util.transform.toDynamoDBFilterExpression($ctx.args.filter) #else null #end,
      "limit": $util.defaultIfNull($ctx.args.limit, 20),
      "nextToken": $util.toJson($util.defaultIfNullOrEmpty($ctx.args.nextToken, null)),
    }
    

    您可以在 AWS AppSync 文档中找到有关扫描和筛选表达式的更多详细信息:

    https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-dynamodb-resolvers.html

    【讨论】:

    • 谢谢您的建议。我发现为数据库创建一个新的“索引”更方便,因此通过该索引/字段进行搜索,该索引/字段排序并返回匹配的记录。谢谢!
    • 您应该知道,在 DynamoDB 中,过滤器是在限制之后应用的。
    猜你喜欢
    • 2019-05-03
    • 2021-07-17
    • 2021-09-13
    • 2020-04-17
    • 2021-02-08
    • 2019-09-20
    • 1970-01-01
    • 2023-03-30
    • 2019-12-31
    相关资源
    最近更新 更多