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

时间:2018-08-24 08:54:34

标签: amazon-web-services indexing amazon-dynamodb

我想知道是否可以创建一个看起来像这样的索引

{
  "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.leftdispensers.right并将其用作键,我也不能弄清楚如何根据点胶机ID的路径。

可以用当前的结构实现吗?如果没有,那么您会建议采用哪种文档结构。可以让我保存相同的数据吗?

2 个答案:

答案 0 :(得分:1)

DynamoDB不支持您尝试执行的操作(将地图元素用作索引的键属性)。

  

索引分区键和排序键(如果存在)可以是字符串,数字或二进制类型的任何基表属性。 (Source

您不能将map属性(的元素)用作索引的键属性,因为键属性必须是基表中的字符串,数字或二进制属性。

请考虑使用adjacency list design pattern作为数据。它将使您可以轻松地将左右分配器添加到索引中。

答案 1 :(得分:0)

我的新结构看起来像这样

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作为分区键的索引,因此我可以查找给定机器人的分配器(使用表格)或查找有关分配器的详细信息(使用索引)