1

我的表是(device, type, value, timestamp),其中(device,type,timestamp)创建了一个唯一组合(非 DynamoDB DBMS 中复合键的候选者)。

我的查询可以介于这三个属性中的任何一个之间,例如

GET ( value)s from ( device) with ( type) 具有 ( timestamp) 大于 < some-timestamp>

我正在使用dynamoosejs/dynamoose。从大多数搜索中,我相信我应该使用三个字段的组合(作为单个字段 ; device-type-timestamp)作为id. 但是set: functionofSchema不允许我使用对象属性(例如this.device),并且由于某些原因,我无法在外部执行此操作。

我得到的最接近的 ( id:uuidv4:hashKey, device:string:GlobalSecIndex, type:string:LocalSecIndex, timestamp:Date:LocalSecIndex)

( id:uuidv4:rangeKey, device:string:hashKey, type:string:LocalSecIndex, timestamp:Date:LocalSecIndex)

等等..

但是,在使用 Query 时,很难获取特定device,type的结果,因为id, (hashKeyrangeKey) 总是从场景中丢失。

所以这个问题。对于这样的桌子,你会怎么做?

需要注意的是,该表旨在收集来自 IoT 设备的内容,每个设备平均每 5 分钟生成一次。

4

2 回答 2

2

我很好奇您为什么选择 DynamoDB 来完成这项任务。与 NoSQL 数据库相比,像这样的高级查询似乎更适合基于 SQL 的数据库。由于 SQL 查询的高级特性,根据我的经验,这项任务在 SQL 数据库中要容易得多。因此,我鼓励您考虑一下 DynamoDB 是否真的适合您在这里尝试做的事情。

如果您确定它是,您可能需要稍微重构您的数据。你可以做一些事情,比如拥有一个属性,device-type它将是设备和类型值的组合。然后将其设置为索引,并根据它进行查询并按时间戳排序,并过滤掉不大于您想要的值的结果。

您是正确的,目前,Dynamoose 没有将整个对象传递给set函数。这是我个人愿意探索的事情。我是 GitHub 项目的成员,如果您想提交 PR 添加该功能,我将非常乐意帮助您探索该选项并将其纳入代码库。

您可能想要探索的另一件事是拥有一个 DynamoDB 流,它会在将device-type其添加到您的 DynamoDB 表时设置该属性。这将从 DynamoDB 和您的应用程序中抽象出该逻辑。我不确定您所做的事情是否有必要将其解耦到那个级别,但这可能是您想要探索的东西。

最后,根据您的设置,您可以确定哪个项目更独特,device或者type,并在该属性上设置索引。然后只需根据它进行查询,并过滤掉您不想要的其他属性的结果。我不确定这是否是您正在寻找的东西,它当然会起作用,但我不确定您的表中有多少项目,并且在一定程度上存在关于可伸缩性的问题。TTL如果您知道要查询的时间戳是恒定的或可提前预测的,那么解决其中一些可伸缩性问题的一种方法可能是设置您的项目。

总的来说,有很多方法可以实现您想要做的事情。如果没有更多关于有多少项目、这些属性将做什么、您需要的可伸缩性、哪些属性将是最独特的等等的详细信息,就很难给出一个好的解决方案。我强烈建议您考虑一下 NoSQL 是否真的是最好的方法。您正在寻找的那个查询看起来更像是一个 SQL 查询。并不是说这在 DynamoDB 中是不可能的,但它需要考虑如何构建数据模型等等。

于 2018-10-08T00:35:47.683 回答
0

考虑到@charlie-fish 的意见,我决定跳入Dynamoose并即兴编写代码以将模型传递给set属性的函数。但是,我发现model已经被传递给default属性的参数。所以我将我的更改Schema为以下内容:

  id:hashKey;default: function(model){ return model.device + "" + model.type; }
  timestamp:rangeKey

对于任何登陆此答案的人,请注意default&set函数可以使用this. 但是,这两个函数都应该是常规函数,而不是箭头函数。

将其保留在这里作为答案,但我暂时不会接受它作为我问题的答案,因为我想等待其他人提出更好的方法。我还想确保如果为id字段传递了一个值,则不应设置它。为此,我可以set用来忽略实际的传入值,目前我还不知道如何。

于 2018-10-09T07:07:09.290 回答