【问题标题】:Secondary index on top-level item in JSON in DynamoDBDynamoDB 中 JSON 中顶级项目的二级索引
【发布时间】:2017-07-21 15:37:17
【问题描述】:

我将一个带有 JSON 的项目放入 DynamoDB 中的一个表中:

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

table.putItem(item);

json 存储在属性 jsondata 中为

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

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

或者我必须为此创建一个额外的属性吗?根据https://aws.amazon.com/dynamodb/faqs/ 看来应该是可以的,但是我不明白如何指定索引。通过控制台创建索引时,“jsondata.jsonid”似乎不起作用。

“问:在 DynamoDB 中查询 JSON 数据有什么不同吗?

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

【问题讨论】:

    标签: json amazon-dynamodb


    【解决方案1】:

    当 AWS 文档说顶级时,它们是指表级属性 JSON(而不是属性/字段级 Json)。例如,基于AWS DynamoDB Json documentation example,Car 是“顶级”,“Spec”是嵌套结构并被指定为“Document”。您不能在“Spec”上创建索引,但可以在“Car”的属性上创建索引。同样适用于您问题中的示例。 “Person”的属性将是顶级元素,但“Friends”将被嵌套,因此您不能真正在“Friends”上创建索引。

    您的示例的一个可能解决方案是,取出“jsonid”元素,然后存储 JSON,例如:{ "N" : "4711" } 然后您可以在 N 上创建索引。如果您的结构这么简单,那么您不要' t 甚至索引,指定 N 作为主键也足够了。

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

    【讨论】:

    • 在这种情况下,文档真的很微妙(意思是令人困惑和明显的误导)。但看起来你是对的。
    【解决方案2】:

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

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

    在上述场景中,jsondata 将作为 Map 数据类型保存在 DynamoDB 表中。所以,不能在属性jsondata.jsonid上创建索引。

    【讨论】:

      猜你喜欢
      • 2017-09-29
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多