Резолвер запросов AWS appsync

В настоящее время у меня есть свой преобразователь как лямбда-функция:

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

Я хотел бы иметь это как преобразователь VTL на Dynamodb. Моя проблема в том, что в моей таблице есть ключ сортировки  введите описание изображения здесь

Это означает, что я не могу использовать пакетный преобразователь для запроса кучи идентификаторов, потому что мне также нужно будет предоставить ключ сортировки, а мне просто нужны все результаты по ключу первичного раздела.

Как вы запрашиваете набор идентификаторов с помощью VTL, в основном реплицируя мою лямбда-функцию в VTL. Это вообще возможно?

Схема добавлена, извините за беспорядок, это работа в стадии разработки, и я пытаюсь многое сделать. Все еще очень новичок в 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
}

person hounded    schedule 29.08.2018    source источник
comment
Могу ли я добавить еще один индексный ключ к первичному ключу раздела, чтобы запустить пакетный преобразователь для ключа индексного устройства. Это будет средняя база данных записи, поскольку несколько IoT будут писать в нее, я читаю, создание индекса при высокой записи - плохая идея, входы?   -  person hounded    schedule 30.08.2018
comment
Можете ли вы предоставить свою схему GraphQL?   -  person Tinou    schedule 30.08.2018
comment
добавил, это немного беспорядок и WIP   -  person hounded    schedule 30.08.2018


Ответы (1)


Да, вы можете это сделать, но вам нужно будет немного изменить схему. В этой лямбда-выражении вы, по сути, говорите «для каждого устройства выполните запрос 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 для реализации этих GetItems и запросов. Это хорошая отправная точка. Сообщите мне, если у вас возникнут проблемы с внедрением VTL.

person mparis    schedule 30.08.2018
comment
Спасибо, mparis, пойду искать. Я, возможно, вернусь с некоторыми вопросами. - person hounded; 30.08.2018
comment
Обновлено за опечатку - person mparis; 30.08.2018