我正在尝试使用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)
}
}
我的问题是,无论是否已经找到主键,实现强制插入的最佳方法是什么?