【问题标题】:How can I Query on TTL in dynamoDB?如何在 dynamoDB 中查询 TTL?
【发布时间】:2018-10-03 21:27:48
【问题描述】:

我在我的 dynamoDB 表中设置了一个 TTL 属性。当我推送记录以获取当前日期(在节点中使用 js sdk)并向其添加一个值(如 5000)。据我了解,当达到该日期时,aws 将清除记录,但仅在 48 小时内。在此期间,记录可以作为查询的结果返回。 我想过滤掉过期的项目,这样如果它们过期但没有被删除,它们就不会作为查询的一部分返回。 这是我用来尝试这样做的:

var epoch = Math.floor(Date.now() / 1000);
console.log("ttl epoch is ", epoch);
var queryTTLParams = {
    TableName : table,
    KeyConditionExpression: "id = :idval",
    ExpressionAttributeNames:{
        "#theTTL": "TTL"
    },
    FilterExpression: "#theTTL < :ttl",
    ExpressionAttributeValues: {
        ":idval": {S: "1234"},
        ":ttl": {S: epoch.toString()}
    }
};

我没有得到任何结果。我相信这个问题与 TTL 属性是一个字符串有关,而我试图在它上面做一个

【问题讨论】:

  • 另外,你的比较应该大于不小于时代。您想过滤尚未过期的值吗?满足过滤条件的项目将被返回。你可能会反过来想。

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


【解决方案1】:

根据Enabling Time to Live AWS 文档,TTL 应该设置为 Number 属性:

TTL 是一种为表中过期项目设置特定时间戳的机制。时间戳应表示为表中项目的属性。 该属性应该是一个包含时间的数字数据类型,以epoch格式。一旦时间戳过期,相应的项目就会在后台从表中删除。

您可能只需要创建一个新的 Number 属性并将 TTL 属性设置为那个。

【讨论】:

  • 看起来您的代码正在将值写入字符串:":ttl": {S: epoch.toString()}。您是否尝试过使用 N 代替(并删除 toString())?
  • 我改用 docClient,现在效果更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
相关资源
最近更新 更多