我正在使用DynamoDB来存储Web应用程序的记录。
每个记录都有一个uuid(分区键)和一个unix时间戳(排序键)。 如何获取按最新时间戳排序的所有记录?
使用扫描非常昂贵,并且显然需要使用查询来提交分区键
我已经尝试过的代码出现以下错误:
Query condition missed key schema element: uuid
我的服务:
serverCallChats() {
return new Promise(async (resolve, reject) => {
const _dynamoDB = new AWS.DynamoDB.DocumentClient();
const daysBack = (days) => {
const date = new Date();
date.setDate(date.getDate() - days);
return date.getTime();
};
const params = {
TableName: 'chat-channel',
KeyConditionExpression: '#sortKeyName < :days',
ExpressionAttributeNames: {
'#sortKeyName': 'timestamp'
},
ExpressionAttributeValues: {
':days': daysBack(7)
}
};
答案 0 :(得分:0)
所以我用例的解决方案是使用FilterExpression中的扫描和过滤器:
return new Promise(async (resolve, reject) => {
const _dynamoDB = new AWS.DynamoDB.DocumentClient();
const daysBack = (days) => {
const date = new Date();
date.setDate(date.getDate() - days);
return date.getTime();
};
const params = {
TableName: 'chat-table',
FilterExpression: 'latestActivity > :hkey',
ExpressionAttributeValues: {
':hkey': daysBack(7)
},
};
_dynamoDB.scan(params, (err, data) => {
if (err) {
console.log(err);
reject(err);
} else {
console.log('chatdata: ', data);
resolve(data);
}
});
});
使用此解决方案,将不会对数据库的输出进行排序,而必须在客户端中完成。但是,考虑到扫描的大小,这是适合我的情况的解决方案