我已经创建了一个排序键SK,并且正在使用begins_with查询消息来检索消息
SK被添加为“消息"
这里日期1月5日在1月4日之前,但是要以排序的顺序检索数据,它应该在1月4日之后。我能做什么来根据日期以逆序以排序的顺序检索消息,
params = {
TableName: "test_chat",
ScanIndexForward: false,
KeyConditionExpression: "PK = :pkval and begins_with(SK, :skval)",
ExpressionAttributeValues: {
":pkval": chatId,
":skval": "message_",
},
Limit: 10,
};
let result = await dynamoDbClient.query(params).promise();
console.log(result);
3条答案
按热度按时间xqk2d5yq1#
您的排序键是
String
类型。DynamoDB正在按指示对字符串进行排序:message_Wed
〉message_Thurs
。ISO 8601的日期字符串(如
2023-01-05T12:22:33.034Z
)更适合于日期排序。rwqw0loc2#
对于Id,请使用KSUID https://www.npmjs.com/package/ksuid根据时间戳自动排序。
cnjp1d6j3#
来自文档:
DynamoDB使用底层UTF-8字符串编码的字节对字符串进行排序和比较。例如,"a"(0x61)大于"A"(0x41),"à"(0xC2BF)大于"z"(0x7A)。
可以使用字符串数据类型来表示日期或时间戳。一种方法是使用ISO 8601字符串,如下例所示:
你也可以称之为字典排序。字典排序一词通常指的是数学规则或排序。例如,这包括从逻辑上证明排序是可能的。在wikipedia上阅读更多关于字典排序的信息
字母顺序包括在如何处理空格、大写字符、数字和标点符号方面不同的变体。纯粹主义者认为,允许除a-z以外的字符使排序不是"字母顺序",因此它必须属于更大的"字典顺序"类别。同样,wikipedia有更多的细节。
在计算机程序设计中,一个相关的问题是字典顺序或ascii代码顺序。在字典顺序中,大写"a"与小写"a"相邻排序。然而,在许多计算机语言中,默认的字符串比较将使用ascii代码。使用ascii,所有大写字母都在任何小写字母之前,这意味着"z"将排在"a"之前。这有时被称为ASCII顺序。
在您的示例中,它只比较
Thu
和Wed
,因为它们是String的第一个唯一字符: