【发布时间】:2021-03-08 10:18:25
【问题描述】:
我对 Dynamodb 和 NoSQL 世界真的很陌生。我正在练习 AWS 的 GSI 和 LSI。我正在使用无服务器框架。我将我的处理程序拆分为多个 lambda 函数。我想创建我的数据,我可以在其中查看所有餐厅以及它们的价格是什么类型的啤酒。另外我想查询所有没有价格的啤酒。我成功创建了餐厅,它的分区键是id。我可以得到所有的餐厅数据。但我坚持啤酒的逻辑。我为 restaurant/{id}/createBeers 这样的啤酒创建了 api 端点,当我发出帖子请求时,我收到错误 "message": "One or more parameter values were invalid: Missing the key id in the item",因为它要求输入餐厅的 ID。我找不到可以添加餐厅 ID 以创建啤酒的逻辑,以及如何免费获得所有啤酒。
餐厅是一对多的。啤酒是多对多的(同名不同价格基于餐厅)。这就是我想要达到的目标。
[
{
"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:
- http:
path: restaurant
method: post
cors: true
getRestaurants:
handler: handlers/getRestaurants.getRestaurants
events:
- http:
path: restaurant/all
method: get
cors: true
createBeers:
handler: handlers/createBeers.createBeers
events:
- http:
path: restaurant/{id}/beers
method: post
cors: true
getBeers:
handler: handlers/getBeers.getBeers
events:
- http:
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"
【问题讨论】:
标签: aws-lambda amazon-dynamodb serverless-framework dynamodb-queries