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要求是:
我很清楚如何将条目附加到列表,甚至从 dynamoDB 的列表中删除特定索引处的条目。
UpdateExpression : "REMOVE lt[0]" - 删除一个元素
UpdateExpression : "REMOVE lt[0] lt[1]" - 删除元素 0 和 1
但是,现在的要求是从列表的开头删除条目,以便从列表中删除早于 24 小时的条目。我已经为此纠结了很长时间,似乎没有任何条件表达式可以帮助我们做到这一点。我错过了什么吗?
Q2作为一种解决方法,我将要求更改为:
如果我为用户收到 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>。
| 归档时间: |
|
| 查看次数: |
255 次 |
| 最近记录: |