首页 > 解决方案 > 在 AWS DynamoDB 查询中,是否可以将字符串查询为数字?

问题描述

在 AWS DynamoDB 查询中,是否可以将字符串查询为数字?

在我的情况下,我有一个 myDate 字段,其中包含从 1970 年开始的秒数,采用字符串格式。它也是全局二级索引上的排序键。

我需要从 DynamoDb 返回所有记录,其中 myDate 在 2 个查询参数之间:fromDate 和 toDate。问题是 myDate 是一个字符串,所以我不能轻易比较这 3 个值。目前我有一个看起来像这样的查询:

var params = {
                TableName: "MyTable",
                IndexName: "GSI",
                KeyConditionExpression: "primaryKey = :primaryKey AND myDate BETWEEN :fromDate AND :toDate",
                ExpressionAttributeValues: {
                    ":primaryKey ": {"N": "1"},
                    ":fromDate": {"S": "1550637900"},
                    ":toDate": {"S": "1550639400"}
                }
}

但是,由于字符串比较,这将无法正常工作。例如“2”>“10”。那么有没有办法对 myDate 进行数字比较?

亚马逊特别提到它不可能直接:

BETWEEN :大于或等于第一个值,小于或等于第二个值。

AttributeValueList 必须包含两个相同类型的 AttributeValue 元素,String、Number 或 Binary(不是集合类型)。如果目标值大于或等于第一个元素并且小于或等于第二个元素,则目标属性匹配。如果项目包含与请求中提供的类型不同类型的 AttributeValue 元素,则该值不匹配。例如,{"S":"6"} 不与 {"N":"6"} 比较。此外, {"N":"6"} 不能与 {"NS":["6", "2", "1"]} 比较

但也许有更好的方法我没有看到?

标签: amazon-web-servicesamazon-dynamodbdynamodb-queries

解决方案


不,你不能。

正如你所发现的,它暂时不会成为问题。多长时间取决于...如果您正在处理 32 位 Unix/Linux Epoch 值...那么这些值将在2038年用完

否则,您不必担心,直到 2286,当您达到 10000000000(11 位)

将来,考虑将日期/时间存储为 ISO 格式的字符串,"2019-07-29T12:37:54Z"或者"20190729T123754Z"

这会照顾你到 9999 年。


推荐阅读