AWS appsync 查询解析器
Posted
技术标签:
【中文标题】AWS appsync 查询解析器【英文标题】:AWS appsync query resolver 【发布时间】:2019-02-04 19:10:04 【问题描述】:目前我将解析器用作 lambda 函数:
import boto3
from boto3.dynamodb.conditions import Key
def lambda_handler(event, context):
list = []
for device in event['source']['devices'] :
dynamodb = boto3.resource('dynamodb')
readings = dynamodb.Table('readings')
response = readings.query(
KeyConditionExpression=Key('device').eq(device['device'])
)
items = response['Items']
list.extend(items)
return list
我希望能够将它作为 dynamodb 上的 VTL 解析器。我的问题是我的表有一个排序键
这意味着我不能使用批处理解析器来查询一堆 id,因为我还需要提供排序键,并且我只想要主分区键的所有结果。
如何使用 VTL 查询一堆 id,基本上是在 VTL 中复制我的 lambda 函数。这甚至可能吗?
已添加架构,请原谅混乱,这是一项正在进行的工作并且正在尝试很多事情。对 graphQL 来说还是很新的
type Device
id: String
device: String!
input DeviceInput
id: String
device: String!
type DeviceReadings
devices: [Device]
type Mutation
createDevice(input: DeviceInput): Device
type PaginatedDevices
devices: [Device]
readings: [Reading]
cows: [cow]
nextToken: String
type Query
getAllUserDevices(nextToken: String, count: Int): PaginatedDevices
getAllDeviceReadings: DeviceReadings
getAllUserReadings: DeviceReadings
getAllReadings(deviceId: String!): Readings
getCowReadings(cowId: String!): UserCowReadings
type Reading
device: String
time: Int
cow: Int
battery: String
type Readings
items: [Reading]
type UserCowReadings
devices: [Device]
readings: [Reading]
type cow
id: Int
device: String
nait: String
schema
query: Query
mutation: Mutation
【问题讨论】:
我可以向主分区键添加另一个索引键,以便我可以在索引设备键上运行批处理解析器。这将是一个中等写入数据库,因为一些物联网将写入它,我读到在高写入时创建索引是一个坏主意,输入? 你能提供你的 GraphQL 架构吗? 添加了,有点乱而且WIP 【参考方案1】:是的,您可以这样做,但您需要稍微调整一下您的架构。在那个 lambda 中,您实质上是在说“为每个设备执行 DynamoDB 查询以获取该设备的最新读数”。从概念上讲,我会说设备有很多读数。考虑到这一点,让我们制作一个架构:
type Device
id: ID!
name: String
# Get the most recent readings for this device.
# Do a Query where "device = $ctx.source.id"
readings(limit: Int, nextToken: String): ReadingConnection
type Reading
# Use the source's device id in the table to fetch the real device
# GetItem where device = $ctx.source.device (and any sort key condition)
device: Device
time: Int
cow: Int
battery: String
type ReadingConnection
items: [Reading]
nextToken: String
type DeviceConnection
items: [Device]
nextToken: String
type Query
getAllDevices(limit: Int, nextToken: String): DeviceConnection
然后,您可以对您的设备进行分页,并分别对每个设备的读数进行分页:
query GetAllDevicesAndReadings
getAllDevices(first: 10)
items
id
name
readings(limit: 10)
time
cow
battery
我建议使用 AppSync 控制台的解析器页面中的下拉菜单来获取更多关于您可以使用解析器 VTL 执行哪些操作来实现这些 GetItem 和查询的想法。这是一个很好的起点。如果您在实施 VTL 时遇到问题,请告诉我。
【讨论】:
谢谢mparis,我去看看。我可能会带着一些问题回来。 更新错别字以上是关于AWS appsync 查询解析器的主要内容,如果未能解决你的问题,请参考以下文章
使用 appsync 解析器、aws dymaodb 的嵌套查询
如何使用 Aws AppSync 将 JWT 令牌(或任何其他变量)从父解析器传递给子解析器