NodeJS Dynamodb排序键未按排序顺序返回数据

kiayqfof  于 2023-01-08  发布在  Node.js
关注(0)|答案(3)|浏览(147)

我已经创建了一个排序键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);
xqk2d5yq

xqk2d5yq1#

您的排序键是String类型。DynamoDB正在按指示对字符串进行排序:message_Wedmessage_Thurs
ISO 8601的日期字符串(如2023-01-05T12:22:33.034Z)更适合于日期排序。

rwqw0loc

rwqw0loc2#

对于Id,请使用KSUID https://www.npmjs.com/package/ksuid根据时间戳自动排序。

cnjp1d6j

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顺序。
在您的示例中,它只比较ThuWed,因为它们是String的第一个唯一字符:

str1 = "message_Thu, 05 Jan 2023 11:27:16 GMT_3b60";
str2 = "message_Wed, 04 Jan 2023 10:43:16 GMT_3b60";

console.log(str1>str2);

false

相关问题