在 GET 请求中使用多个参数从 DynamoDB 获取数据

Getting data from DynamoDB using multiple parameters in GET Request

我有一个用 node 编写的 lambda 函数,我正在尝试获取特定锻炼课程的数据。

url 看起来像这样

workout/{workoutId}/sessions/{sessionId}

我知道如果我只想 workoutId

我可以做类似下面的事情
module.exports.getWorkoutSession = (event, context, callback) => {
  const { workoutId } = event.pathParameters;
  const params = {
    TableName: workoutTable,
    Key: {
      id: workoutId,
    },
  };

  return db.get(params).promise().then(res => {
      if(res.item) {callback(null, response(200, res.Item));} else {
          callback(null, response(404, {error: "workoutId not found"}))
      }
  })
};

但我如何修改此函数以便获取特定锻炼的会话数据?

答案取决于数据在 Dynamo DB 中的存储方式。如果您有这两个用例 -

  1. 获取 workoutId 的所有会话的数据(使用事件参数中的 workoutId)和
  2. 获取训练 ID 的特定会话的数据(使用事件参数中的 workoutId 和 sessionId)

那么这两个可以通过下面的table结构来解决

Hash Key: workoutId
Range Key(Partition Key): sessionId

和下面的代码

/** API to get all sessions of a workout. Called by url workout/{workoutId} */
module.exports.getWorkoutSessions = async (event, context, callback) => {
    const { workoutId } = event.pathParameters;
    const params = {
        TableName: workoutTable,
        KeyConditionExpression: '#workoutId = :workoutId',
        ExpressionAttributeNames: {
            '#workoutId': 'workoutId'
        },
        ExpressionAttributeValues: {
            ':workoutId': workoutId
        }
    };

    const db = new AWS.DynamoDB.DocumentClient();
    try {
        const res = await db.query(params).promise();
        return res.Items;
    } catch (error) {
        console.error('Error while getting workout sessions', error);
        throw error;
    }
};

/** API to get a specific session of a workout. Called by url workout/{workoutId}/sessions/{sessionId} */
module.exports.getWorkoutSession = async (event, context, callback) => {
    const { workoutId, sessionId } = event.pathParameters;
    const params = {
        TableName: workoutTable,
        Key: {
            workoutId: workoutId,
            sessionId: sessionId
        }
    };

    const db = new AWS.DynamoDB.DocumentClient();
    try {
        return await db.getItem(params).promise();
    } catch (error) {
        console.error('Error while getting workout session', error);
        throw error;
    }
};