Dynamodb按多个键排序和过滤

时间:2018-03-19 18:18:13

标签: node.js amazon-web-services nosql amazon-dynamodb

我正在尝试存储三个主要列以保存用户的分数

User        DateTime                     Score
1           2018-01-01-09-00             5
1           2015-11-24-11-32             2
2           2014-11-24-11-32             1
3           2016-11-24-11-32             3

我需要/更容易的功能:

  • 用户/日期时间必须是唯一的 - (因此将其用作分区/范围键)
  • 得分需要使用UpdateExpression: "ADD #C :num"以原子方式递增(他们可以在一分钟内得分5次,而不是得分为5分)
  • 需要检索特定的用户/时间分数条目

当我需要时,复杂的位得到:

  • 需要检索datetime包含某个部分的所有条目(例如可能是2018年,可能是2018-01) - 在“查询”中,因此是有效的检索,但按分数排序。这让我可以按天,月,年,小时等找出用户的最高分。

由于以下原因导致并发症:

  1. '得分'不能用作复合键的一部分,因为它是原子级增加的。
  2. 由于要求使用'BeginsWith'
  3. ,DateTime必须在范围键中

    我能看到这样做的唯一方法就是有两个表:

    User        DateTime            compound    
    (partition) (range key)               
    1           2018-01-01-09-00    1#2018-01-01-09-00          
    1           2015-11-24-11-32    1#2015-11-24-11-32               
    2           2018-01-01-09-00    2#2018-01-01-09-00    
    3           2016-11-24-11-32    3#2018-01-01-09-00      
    

    表2:

    user#DateTime                     Score
    (partition key)                   (range key)
    1#2018-01-01-09-00                5
    1#2015-11-24-11-32                2
    2#2014-11-24-11-32                1
    3#2016-11-24-11-32                3
    

    在哪里做两个查询  1.获取以(2018-01 *)开头的DateTimes列表  2.获取所有返回日期时间的分数。

    然而,这似乎过多,因为有多个查询。

    是否有一些明显的错过,因为它似乎是dynamodb作为简单查找的主要候选者。

    我不想单独保存日期的每个阶段,例如2018,2018-01,2018-01-01,2018-01-09因为这看起来非常过分重复并且需要写入更新。

    理想情况下,我会有一个复合范围键 得分#dateTime,但由于得分必须以原子方式更新,我无法做到这一点。

0 个答案:

没有答案