0

我正在尝试使用aws-sdk for javascript创建一个名为events的 dynamo 表,特别是AWS.DynamoDB.DocClient()。它被设置为简单地跟踪任何和所有用户事件,并且是一个超级简单的结构。结构如下:

cognitoId(主键) 事件类型 时间戳
* * *

我遇到的问题是,如果用户已经在表中,它不是在表中插入或放入新条目,而是更新。现在我知道它为什么这样做了,因为cognitoId主键,这是 put 函数的预期功能。如果找到主键,它会更新,如果没有,则添加。

我尝试了几种不同的方法,甚至是ConditionalExpression,但无论主键如何,我仍然无法从本质上强制添加一个条目。

我的基本实现如下:

exports.handler = async (event, context, callback) => {
  const { EventsTable } = process.env;
  const { detail } = event;
  const {
    sub,
    eventType = 'Post Authentication'
  } = detail;

  const timestamp = moment().tz("America/New_York").format();

  const params = {
    TableName: EventsTable,
    Item: {
      cognitoId: sub,
      eventType,
      timestamp,
    },
    ExpressionAttributeNames: {
      '#timestamp': 'timestamp'
    },
    ExpressionAttributeValues: {
      ':timestamp': timestamp
    },
    ConditionExpression: '#timestamp <> :timestamp'
  }

  console.log(params);

  try {
    const data = await docClient.put(params).promise();
    callback(null, event);
  }
  catch (err) {
    console.log(err);
    callback(null, event)
  }
}

我的问题是,无论是否已经找到主键,实现强制插入的最佳方法是什么?

4

1 回答 1

0

现在我知道它为什么这样做了,因为 cognitoId 是主键,这是 put 函数的预期功能。如果找到主键,它会更新,如果没有,则添加。

听起来您很清楚为什么会发生这种情况。听起来单独的 Cognito ID 不足以在您的特定用例中唯一地表示用户事件。您可能想看看复合主键。即,由多条信息组成的主键。例如,也许您可​​以使用 Cognito ID 和时间戳字段来唯一标识一个事件。或者,如果用户事件可以同时发生,可能是某种唯一标识符(例如 UUID/KSUID/ULID)。

考虑在复合主键中包含时间戳。这样,您可以拥有一个项目集合来随着时间的推移聚合用户事件。

于 2021-04-27T16:49:58.337 回答