AWS Appsync查询解析器

时间:2018-08-29 22:21:08

标签: amazon-web-services graphql aws-appsync resolver

目前,我将解析器作为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解析器。我的问题是我的桌子有一个排序键enter image description here

这意味着我不能使用批处理解析器来查询一堆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
}

1 个答案:

答案 0 :(得分:2)

是的,您可以这样做,但是您需要稍微调整一下架构。在该lambda中,您实际上是在说“对每个设备执行DynamoDB查询以获取该设备的最新读数”。从概念上讲,我会说设备有很多读数。考虑到这一点,让我们建立一个模式:

PreferenceCategory

然后,您可以分别浏览设备和浏览每个设备的读数:

PreferenceScreen

我建议使用AppSync控制台的解析器页面中的下拉列表,以获取有关可以使用解析器VTL来实现这些GetItems和Queries的更多信息。这是一个很好的起点。如果您在实施VTL时遇到问题,请告诉我。