以字段值或元素数量为条件删除 dynamo db 列表中的前几个条目

Our*_*ros 5 nosql amazon-dynamodb

我在 dynamoDB 中有一个数据集,如下所示:

{
    "userID" : 2323423,    // Primary Key
    "lt" :  [
            {
                  "timestamp"   : epoch1,
                  "coordinates" : "coordinate1"
            },
            {
                  "timestamp"   : epoch2,
                  "coordinates" : "coordinate2"
            },
            ...
        ]
}
Run Code Online (Sandbox Code Playgroud)

“lt”是位置跟踪列表,用于存储用户 ID 在不同时间的坐标值。

Q1要求是:

  • 每个用户最多存储 1 天的位置跟踪数据,只有在收到新的 LT 坐标数据条目时才会自动删除
  • 这意味着一次可能会有陈旧的 LT 数据,所有这些数据的持续时间都是 24 小时。但是,一旦新的 LT 坐标数据出现,就会删除陈旧的条目,以便删除超过 24 小时的条目。

我很清楚如何将条目附加到列表,甚至从 dynamoDB 的列表中删除特定索引处的条目。

UpdateExpression : "REMOVE lt[0]" - 删除一个元素

UpdateExpression : "REMOVE lt[0] lt[1]" - 删除元素 0 和 1

但是,现在的要求是从列表的开头删除条目,以便从列表中删除早于 24 小时的条目。我已经为此纠结了很长时间,似乎没有任何条件表达式可以帮助我们做到这一点。我错过了什么吗?

Q2作为一种解决方法,我将要求更改为:

  • 将最后 100 个条目存储到这个“lt”列表中。
  • 这将为用户保留潜在的陈旧 LT 数据,以防未收到他们的 LT 数据

如果我为用户收到 N 个新的 LT 点数,如果总条目数变为 100 + “n”个,我想删除前“n”个条目。如果条目总数小于或等于 100,则无需删除条目。

我显然可以将新的 N 个条目附加到用户项的“lt”列表中,取回该用户项,找出条目的总数,然后删除第一个“n”个条目,但这将是低效的,因为我将有进行两个查询,其中一个我必须返回整个“lt”列表。如果可以通过某种 Count 构造检索“lt”列表的大小,这将有所帮助,有没有。

我想了解它实际上应该如何完成?

Ale*_*kis -1

您不需要将位置建模为列表。您可以将它们建模为地图,并使用 HH:MM 作为地图的键。在您的更新表达式中,只需SET lt.#hhmm = :coord使用ExpressionAttributeNames={#hhmm:"16:05"}ExpressionAttributeValues={:coord:"0,0"}。如果每分钟记录一次位置,则意味着地图中有 24 * 60 = 1440 个条目lt。如果每个坐标对的长度为 19 个字符,则每个条目大约有 30 个字节,如果每分钟记录一次,则每人大约有 43 KB。

使用上述方案,每个用户每分钟大约需要 43 WCU,或者每秒不到 1 WCU,才能以分钟粒度维护当前位置。对于一位客户来说,这有点高。相反,您可以将用户位置项目拆分为 30 分钟的存储桶,使用 48 个此类项目来覆盖每个人的 24 小时跨度。因此,UpdateItem 写入成本将为每分钟 1 WCU 或每小时 60 WCU。哈希键的形式类似于<user_id>_HH:<00 or 30>