在DynamoDB中从嵌套结构创建索引

3
我想知道是否有可能创建一个类似于这样的索引
{
  "dispenserId": "my-dispenser-123",  // primary key
  "users": ["user5", "user12"],
  "robotId": "my-robot-1",
  "enabled": true,
  "side": left
}

根据我的DynamoDB文档,其格式如下:
{
  "robotId": "my-robot-1",    // primary key
  "dispensers": {
    "left": "left-dispenser-123",
    "right": "right-dispenser-123",
    "users": ["user5", "user12"]
  },
  "enabled": true,
  "users": ["user1", "user32"]
}

我无法弄清楚如何指向dispensers.left或者dispensers.right并将其用作键,也不知道如何根据发放器ID的路径创建基于side: left/right的属性。

如果当前结构无法实现,你们建议使用什么文档结构呢?哪种结构能让我保留相同的数据?

2个回答

5
你试图使用地图元素作为索引的键属性,但是 DynamoDB 不支持这样做。
索引分区键和排序键(如果存在)可以是任何字符串、数字或二进制类型的基本表属性。(来源
你不能将地图属性的元素用作索引的键属性,因为键属性必须是来自基本表的字符串、数字或二进制属性。
考虑使用 邻接列表设计模式 来处理数据。它将允许您轻松地将左右分配器都添加到索引中。

看起来现在对我来说是有效的。只是一个额外的问题:DynamoDB是否可以自动生成排序键?如果我插入一个类型为“dispenser”的记录,它会变成“dispenser-<dispenserID>”,反之亦然,如果类型为“robot”?还是我必须在代码中生成该键? - Esben von Buchwald
你需要自己生成它。然而,如果你正在使用DynamoDBMapper库,你可以滥用DynamoDBTypeConverter接口将String转换为String,并添加/删除id的类型前缀。 - Matthew Pope

2

我的新结构看起来像这样

partition key: robotId
sort key: compoundKey

[
  {
    "robotId": "robot1", 
    "enabled": true, 
    "users": [
      "user1", 
      "user3"
    ], 
    "compositeKey": "robot--robot1"
  }, 
  {
    "robotId": "robot1", 
    "dispenserId": "dispenser1", 
    "compositeKey": "dispenser--dispenser1", 
    "side": "left", 
    "users": [
      "user4", 
      "user61"
    ]
  }
]

那么我有一个以dispenserId作为分区键的索引,因此我可以使用表格查找给定机器人的分配器,或者查找有关分配器的详细信息(使用索引)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接