Dynamodb-serverless отношения один ко многим и многие ко многим

Я действительно новичок в мире Dynamodb и NoSQL. Я практикую AWS GSI и LSI. Я использую бессерверный фреймворк. Я разделил свои обработчики на несколько лямбда-функций. Я хочу создать свои данные, в которых я могу видеть все рестораны и цену какого сорта пива. Также я хочу запросить все сорта пива без цены. Я успешно создал ресторан с ключом раздела id. Я могу получить все данные о ресторанах. Но я придерживался пивной логики. Я создаю конечную точку api для такого пива restaurant/{id}/createBeers, когда я делал почтовый запрос, я получал ошибку «message»: «One or more parameter values were invalid: Missing the key id in the item», потому что он запрашивал идентификатор ресторана. Я не могу найти логику, в которой я могу добавить идентификатор ресторана для создания пива и как получить все пиво бесплатно.

Ресторан один ко многим. Пиво много ко многим (одно и то же название, разные цены в зависимости от ресторана). Это то, чего я хочу достичь.

[ { «id»: 1, «name»: «restaurent 1», «beers»: { «tap-beers»: [{ «name»: «beer 1», «price»: «2$» }, { «name»: «beer 2», «price»: «2$» } ], «bottle-beers»: [{ «name»: «beer 3», «price»: «2$» }, { «name»: «beer 4», «price»: «2$» } ] } }, { «id»: 2, «name»: «restaurent 2», «beers»: { «tap-beers»: [{ «name»: «beer 1», «price»: «3$» }, { «name»: «beer 2», «price»: «3$» } ], «bottle-beers»: [{ «name»: «beer 3», «price»: «4$» }, { «name»: «beer 4», «price»: «6$» } ] } } ]

Вот как я хочу получить все пиво на столе

[ { «beername»: «beer 1» }, { «beername»: «beer 2» }, { «beername»: «beer 3» }, { «beername»: «beer 4» } ]

Это мой ресторан

const dynamoDb = new AWS.DynamoDB.DocumentClient(); module.exports.createRestaurant = async event => { const resquestBody = JSON.parse(event.body); const params = { TableName: «table name», Item: { id: uuid.v1(), name: resquestBody.name, beers: [] // in here I will add beers when I can create a beer my post method path // is restaurant/{id}/createBeers } } try { await dynamoDb.put(params).promise(); return { statusCode: 200, body: JSON.stringify(resquestBody), }; } catch (error) { return { statusCode: 500, body: JSON.stringify(error), }; } };

Это создание обработчика пива

const dynamoDb = new AWS.DynamoDB.DocumentClient(); module.exports.createBeers = async event => { const requestBody = JSON.parse(event.body); const params = { TableName: «table name», Item: { beer_name: requestBody.beer_name, beer_type: requestBody.beer_type, beer_price: requestBody.beer_price } }; try { await dynamoDb.put(params).promise(); return { statusCode: 200, body: JSON.stringify(requestBody), }; } catch (error) { return { statusCode: 500, body: JSON.stringify(error), }; } };

Это мой GSI пиво бесплатно

module.exports.getBeers = async event => { const params = { TableName: «beer», IndexName: «beers», KeyConditionExpression: «beer_name = :beer_name», ExpressionAttributeValues: { «:beer_name»: «beer_name» }, Limit: 1 } try { let data = await dynamoDb.query(params).promise(); return { statusCode: 200, body: JSON.stringify(data.Items), }; } catch (error) { return { statusCode: 500, body: JSON.stringify(error), }; } }

Это мой бессерверный yml-файл

functions: createRestaurant: handler: handlers/createRestaurant.createRestaurant events: — https: path: restaurant method: post cors: true getRestaurants: handler: handlers/getRestaurants.getRestaurants events: — https: path: restaurant/all method: get cors: true createBeers: handler: handlers/createBeers.createBeers events: — https: path: restaurant/{id}/beers method: post cors: true getBeers: handler: handlers/getBeers.getBeers events: — https: path: beers/all method: get cors: true resources: Resources: table: Type: «AWS::DynamoDB::Table» DeletionPolicy: Retain Properties: AttributeDefinitions: — AttributeName: id AttributeType: S — AttributeName: beer_name AttributeType: S KeySchema: — AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 GlobalSecondaryIndexes: — IndexName: beers KeySchema: — AttributeName: beer_name KeyType: HASH Projection: ProjectionType: ALL ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 TableName: «tableName»

Источник: ledsshop.ru

Стиль жизни - Здоровье!