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

时间:2019-07-29 08:50:59

标签: amazon-web-services amazon-dynamodb dynamodb-queries

在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”]}的比较

但是也许我看不到更好的方法?

1 个答案:

答案 0 :(得分:1)

不,你不能。

正如您所发现的那样,暂时不会有问题。多久取决于...如果您要处理的是32位Unix / Linux Epoch值...那么这些值将在2038

中用完

否则,直到2286达到10000000000(11位数字)时,您都不必担心

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

这将在9999年为您服务。