删除dynamo db list中的前几个条目,条件是字段值或元素数量

时间:2016-08-26 10:01:10

标签: amazon-dynamodb nosql

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

{
    "userID" : 2323423,    // Primary Key
    "lt" :  [
            {
                  "timestamp"   : epoch1,
                  "coordinates" : "coordinate1"
            },
            {
                  "timestamp"   : epoch2,
                  "coordinates" : "coordinate2"
            },
            ...
        ]
}

" lt"是位置跟踪列表,用于在不同时间存储userID的坐标值。

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点,我想删除第一个" n"条目,如果总条目已变为100 +" n"。如果总条目小于或等于100,则无需删除条目。

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

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

1 个答案:

答案 0 :(得分:0)

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

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