Amazon dynamodb AWS AppSync GraphQL通过字段值查询记录

Amazon dynamodb AWS AppSync GraphQL通过字段值查询记录,amazon-dynamodb,graphql,aws-appsync,Amazon Dynamodb,Graphql,Aws Appsync,我有一个用户表,其中包括电子邮件、电话等,我想根据记录的电子邮件或电话值(而不是#Id)查询记录。由于没有足够的知识,我写了一个这样的模式: type Query { ... getUser(id: ID!): User getUserByEmail(input: GetUserByEmailInput!): User ... } input GetUserByEmailInput { email: String! } { "data": {

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

type Query {
    ...
    getUser(id: ID!): User
    getUserByEmail(input: GetUserByEmailInput!): User
    ...
}
input GetUserByEmailInput {
    email: String!
}
{
  "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)"
    }
  ]
}
在针对getUserByEmail(..)的resolver中,我尝试进行实验,但到目前为止没有任何效果,所以它仍然保持默认状态:

因此,当我向查询控制台运行这样的查询时:

query GetUserByEmail {
    getUserByEmail(input: {email: "email@email.com"}) {
      id
      name
      email
      image
    }
  }
这将返回如下错误:

type Query {
    ...
    getUser(id: ID!): User
    getUserByEmail(input: GetUserByEmailInput!): User
    ...
}
input GetUserByEmailInput {
    email: String!
}
{
  "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字段值查询记录?

如果使用控制台中的“创建资源”流,它将创建一个listUsers查询,例如如下所示。注意,DynamoDb操作将是一个具有DynamoDb过滤器表达式的扫描,您可以使用任何字段来查询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文档中找到有关扫描和筛选表达式的更多详细信息:


谢谢你的建议。我发现为数据库创建一个新的“索引”更方便,因此可以通过该索引/字段进行搜索,该索引/字段排序并返回匹配的记录。谢谢您应该知道,在DynamoDB中,过滤器是在限制之后应用的。