2016-08-25 80 views
2

高层次的需求:从dynamoDB列表中的数据类型删除前几个条目

  • 有可能是数以百万计的用户
  • 任何用户可能喜欢的其他用户
  • 用户的位置跟踪数据需要存储的。最多100个最近的数据点必须被存储。

我想用Dynamo DB来实现它,通过以下列格式存储数据(使用NOSQL的动机是检索会很快,因为在一个得到我会得到整个数据):

{ 
    "userID" : 2323423, 
    "favs" : [ 
      userIDA, 
      userIDB, 
      ... 
    ], 
    "lt" : [ 
      {"timestamp1" : "coordinate1"}, 
      {"timestamp2" : "coordinate2"}, 
      ... 
     ] 
} 

userID是主键。

查询要求

  1. 加入收藏夹删除的应该是可能的。
  2. 一束新的时间戳的< => GPS位置对能来,这是我需要送入该用户的“LT”的数据。由于有100个LT数据点的限制,我还需要删除最老的数据点。

我很确定(1)使用列表数据类型上的添加/删除API直接转发。 如何解决查询(2)?如果UPDATE查询本身以某种方式遍历所有对象并删除旧对象,那将是最好的。我读过Dynamo DB理解的列表中的索引是整数格式的,那么我们可以利用它吗?列表中的元素是否始终从0到N编制索引?如果是这样,我可以从数组的开头删除适当数量的元素。有什么办法可以做到吗?

我打开使用不同的数据模式,但请让我知道整个推理和如何可以得到解决。

回答

4

1)属性“的收藏”应当为了使用删除功能被定义为一组数据类型。请注意,您不能在LIST数据类型上使用DELETE。

Delete操作符只能用于SET。

删除 - 删除从一组的元素。

如果指定一组值,那么这些值是从 旧集减去。例如,如果属性值是集[a,b,c] ,并且DELETE操作指定[a,c],则最终属性值 为[b]。指定一个空集是一个错误。

DELETE操作仅支持设置数据类型。另外,DELETE 只能用于顶层属性,而不能用于嵌套属性。

2)要从LIST数据类型中删除事件(即Object),应该知道索引。更新表达可能是类似下面: -

UpdateExpression: “REMOVE LT [0]” - 删除一个元件

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

是的,对于LIST数据类型,索引从0开始到N。

3)有条件地删除项目 - 是的,你可以在ConditionExpression中包含条件。但是,REMOVE需要列表项目的索引。否则,它会删除整个列表(即不是列表中的特定索引)。

此外,当您想要引用列表中的MAP对象时,您需要列表的索引。

示例: 以除去media.id = 3,条件和更新表达式应该如下提及: -

请注意,索引在两个条件和更新表达式中使用。

JavaScript语法以除去 “media.id”= 3: -

var params = { 
     TableName : "Product", 
     Key : { 
      "product" : "IPhone 7+" 
     }, 
     UpdateExpression : "REMOVE media[2]", 
     ConditionExpression: "media[2].id = :idvalue",  
     ExpressionAttributeValues: {":idvalue" : "3", 
     }, 
     ReturnValues : "UPDATED_NEW" 
    }; 

数据: - @notionquest

"media": { 
      "L": [{ 
       "M": { 
        "url": { 
         "S": "http://www.apple.com/iphone-6-plus/a.jpg" 
        }, 
        "type": { 
         "S": "image" 
        }, 
        "id": { 
         "S": "1" 
        } 
       } 
      }, { 
       "M": { 
        "url": { 
         "S": "http://www.apple.com/iphone-6-plus/b.jpg" 
        }, 
        "type": { 
         "S": "image" 
        }, 
        "id": { 
         "S": "2" 
        } 
       } 
      }, { 
       "M": { 
        "url": { 
         "S": "http://www.apple.com/iphone-6-plus/overvie 
         w.mp4 " 
        }, 
        "type": { 
         "S": "video" 
        }, 
        "id": { 
         "S": "3" 
        } 
       } 
      }] 
     } 
+0

感谢。另一个查询是否有可能从“lt”列表中删除旧条目,如果其中的每个条目都是Map with Key值对的时间戳和坐标? { “时间戳”:23423432434, “坐标”:“2.34435,0.3342343” } 因此,通过扫描表中,“LT”,其中时间戳比一些旧的价值里面那些列表条目删除? – Ouroboros

+0

它绝对有帮助。你能否让我知道它是否可以在没有条件表达式的情况下将元素添加到列表中,并且一次删除使用条件表达式列表中的陈旧条目?我不害怕,只是想确认。我不想最终编写一个执行扫描的cron,并删除陈旧的条目(不会太多)。我可以保留100个数据点左右的位置跟踪。希望你能帮忙。 – Ouroboros

+0

只是为了添加到我以前的评论,我可以运行一个查询来追加另一个坐标条目到我的位置跟踪“lt”列表。有没有办法让我可以删除与条件表达式匹配的列表中的所有条目?它可以,如果我不得不单独运行此查询。我的动机是删除时间戳已过期(超过2天)或其他类似内容的“lt”列表的陈旧条目。 – Ouroboros