Amazon dynamodb 根据字段值或元素数量删除dynamo db列表中的前几个条目

Amazon dynamodb 根据字段值或元素数量删除dynamo db列表中的前几个条目,amazon-dynamodb,nosql,Amazon Dynamodb,Nosql,我在dynamoDB中有一个数据集,如下所示: { "userID" : 2323423, // Primary Key "lt" : [ { "timestamp" : epoch1, "coordinates" : "coordinate1" },

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

{
    "userID" : 2323423,    // Primary Key
    "lt" :  [
            {
                  "timestamp"   : epoch1,
                  "coordinates" : "coordinate1"
            },
            {
                  "timestamp"   : epoch2,
                  "coordinates" : "coordinate2"
            },
            ...
        ]
}
“lt”是位置跟踪列表,用于存储用户标识在不同时间的坐标值

Q1要求是:

  • 每个用户最多存储1天的位置跟踪数据,只有在收到新的LT坐标数据输入时才会自动删除
  • 这意味着一次可能会有过时的LT数据,所有这些数据都是24小时的。但是,一旦新的LT坐标数据出现,应立即删除过时条目,以便删除超过24小时的条目
我很清楚如何将条目附加到列表中,甚至如何从dynamoDB的列表中删除特定索引处的条目

UpdateExpression:“删除lt[0]”-删除一个元素

UpdateExpression:“删除lt[0]lt[1]”-删除元素0和1

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

Q2作为一种解决办法,我将需求更改为:

  • 将最后100个条目存储到此“lt”列表中
  • 这将为用户保留可能过时的LT数据,以防他们的LT数据未被接收
如果我为一个用户收到N个新的LT点,我想删除前“N”个条目,如果总条目变成100+“N”。如果总条目数小于或等于100,则无需删除条目

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


我想了解实际应该如何做?

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

使用上述方案,以分钟粒度维护当前位置的成本约为每分钟43个WCU,或每用户每秒不到1个WCU。这对一个客户来说有点高。相反,您可以将用户位置项拆分为30分钟的存储桶,使用48个这样的项覆盖每人24小时的存储空间。因此,UpdateItem写入成本为每分钟1 WCU或每小时60 WCU。散列键的形式类似于
\u HH: