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 令牌(或任何其他变量)从父解析器传递给子解析器

AWS Appsync 批处理解析器

AWS AppSync Lambda 解析器字段

AppSync 查询解析器:是不是需要 expressionNames 和 expressionValues?

Dynamo DB 中的 AWS AppSync 简单 graphql 解析器无法正常工作,这让我发疯