排序键中具有begin_with表达式的AWS App Sync dynamodb解析器用法不起作用

时间:2018-09-30 16:54:16

标签: amazon-dynamodb graphql aws-appsync

我正在尝试获取属于特定用户名的宠物的列表。

表格设计(PetTable):

username: partition key
petId: sort key, 

petId的值是通过将字符串“ petId:”和随机autoId值串联而生成的。因此,如果autoId为3838380022,则petId排序键的值为“ petId:3838380022”

架构:

type Pet {
    username: String!
    petId: ID!
}

type PetsConnection {
    pets: [Pet]
}

type Query {
    getPets(username: String): PetsConnection
}

解析器:

{
    "version" : "2017-02-28",
    "operation" : "Query",
    "query" : {
        ## Provide a query expression. **
        "expression": "username = :username and begins_with(petId, :petId)",
        "expressionValues" : {
            ":username" : {
                "S" : "${ctx.args.username}"
            },
            ":petId" : {
                "S" : "pet"
            }

        }
    }
}

查询:

query GetUserPets {
  getPets(username: "test") {
    pets {
      petId
    }
  }
}

查询响应:

{
  "data": {
    "getPets": {
      "pets": null
    }
  }
}

在Dynamodb中,我有2个完整实例,其中petId(SortKey)以文本pet开头。enter image description here

期望查询应返回2个条目,但不返回任何内容。不知道错误在哪里。任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

我试图重现您的架构并对其进行尽可能多的测试。对我来说很好

[(0, 'a'), (1, 'b'), (2, 'c')]

请确保在为type Pet { username: String! petID: ID! } type Query { getPets(username: String!): [Pet] } schema { query: Query } (用户名为PetTable,petID为PK)创建资源时

enter image description here

为查询附加解析器

enter image description here

DynamoDB

enter image description here

测试结果

enter image description here

答案 1 :(得分:1)

您的响应映​​射模板是什么? 您可能保留了默认的映射模板,该模板将返回结果列表,而不是将查询结果从DynamoDB映射到您的PetConnection类型。

我复制了您的API,并使用相同的GraphQL查询获得了结果。

这是我的响应模板

#set($petConnection = { 'pets': $ctx.result.items })
$util.toJson($petConnection)

结果:

{
  "data": {
    "getPets": {
      "pets": [
        {
          "petId": "petId:1234"
        },
        {
          "petId": "petId:12345"
        }
      ]
    }
  }
}

注意:一种调试应用程序的好方法是从API设置页面启用日志。 请参阅下面的如何启用日志。启用后,转到“查询”窗格,勾选“日志”复选框并执行GraphQL查询。您的应用程序日志应出现在控制台中。 enter image description here