DynamoDB中JSON中顶级项的二级索引

时间:2017-07-21 15:37:17

标签: json amazon-dynamodb

我将带有JSON的Item放入DynamoDB中的表中:

String jsonString = "{"
+ " \"jsonid\": 4711"
+ " }";
Item item = new Item()
.withPrimaryKey("Id", 1)
.withJSON("jsondata", jsonString);

table.putItem(item);

json存储在属性jsondata中

{ "jsonid" : { "N" : "4711" }}

是否可以创建索引“jsonid”的索引?

或者我是否必须为此创建额外属性?根据{{​​3}},它似乎应该是可能的,但我不明白如何指定索引。通过控制台创建索引时,“jsondata.jsonid”似乎不起作用。

“问:在DynamoDB中查询JSON数据有何不同?

没有。您可以在任何顶级JSON元素上创建全局二级索引或本地二级索引。例如,假设您存储了一个JSON文档,其中包含有关某人的以下信息:名字,姓氏,邮政编码以及所有朋友的列表。名字,姓氏和邮政编码将是顶级JSON元素。您可以创建一个索引,以便您根据名字,姓氏或邮政编码进行查询。朋友列表不是顶级元素,因此您无法索引朋友列表。有关全局二级索引及其查询功能的详细信息,请参阅此常见问题解答中的二级索引部分。“

2 个答案:

答案 0 :(得分:0)

Dynamodb不允许在复杂类型(即Map,List等)上创建索引。您只能在标量数据类型上创建索引(即字符串,数字或二进制)。

  

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

在上面的场景中,jsondata将作为 Map 数据类型保存在DynamoDB表中。因此,无法在属性jsondata.jsonid上创建索引。

答案 1 :(得分:0)

当AWS文档显示顶级时,它们意味着表级属性JSON(不是属性/字段级别Json)。例如,基于AWS DynamoDB Json documentation example,Car是"顶级"," Spec"嵌套结构化并被指定为"文档"。您无法在" Spec"上创建索引,但您可以在" Car"的属性上创建索引。同样适用于您问题中的示例。 " Person"的属性将是顶级元素,但"朋友"将嵌套,因此您无法在" Friends"。

上真正创建索引。

你的例子的一个可能的解决方案是,取出" jsonid"然后存储JSON,然后存储JSON,例如:{ "N" : "4711" }然后你可以在N上创建索引。如果你的结构很容易,那么你甚至不是索引,指定N作为主键就足够了

这是Java SDK example on how to create indexes using DynamoDBMapper