我在dynamoDB中有一个数据集,如下所示:
{
"userID" : 2323423, // Primary Key
"lt" : [
{
"timestamp" : epoch1,
"coordinates" : "coordinate1"
},
{
"timestamp" : epoch2,
"coordinates" : "coordinate2"
},
...
]
}
" lt"是位置跟踪列表,用于在不同时间存储userID的坐标值。
Q1 要求是:
我清楚知道如何将条目附加到列表中,甚至从dynamoDB中的列表中删除特定索引处的条目。
UpdateExpression:" REMOVE lt [0]" - 删除一个元素
UpdateExpression:" REMOVE lt [0] lt [1]" - 删除元素0和1
但是,现在要求从列表的开头删除条目,以便从中删除超过24小时的条目。我已经把头撞了很长时间,似乎没有任何条件表达可以帮助我们做到这一点。我错过了什么吗?
Q2 作为解决方法,我将要求更改为:
如果我为用户收到N个新LT点,我想删除第一个" n"条目,如果总条目已变为100 +" n"。如果总条目小于或等于100,则无需删除条目。
我显然可以在用户项目中添加新的N条目" lt"列表,获取用户项目,找出总条目数,然后删除第一个" n"条目,但这将是低效的,因为我将不得不进行两个查询,其中一个我必须返回整个" lt"名单。 如果" lt"的大小会有所帮助。 list可以通过某种Count构造检索,是否有一个。
我想了解它应该如何实际完成?
答案 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>
。