在DynamoDB GSI的投影中使用嵌套字段

时间:2019-02-28 18:24:23

标签: amazon-dynamodb dynamodb-queries

我有一个Dynamo表,用于存储如下所示的文档:

{
  "guid": "<some UUID>"
  "created_at": 1550778260030,
  "display_name": "person",
  "updated_at": 1550778260030,
  "info": {
    "locked": false,
    "confirmed": true,
    "deactivated": false,
    "email": "person@example.com"
  }
}

该表具有由Terraform管理的全局二级索引,定义如下:

    global_secondary_index {
        name = "display_name_index"

        hash_key = "display_name"

        projection_type = "INCLUDE"
        non_key_attributes = [
            "updated_at",
            "info.email",
            "created_at"
        ]
    }

但是,当我查询表时,未返回info.email字段:

aws dynamodb query \
  --table-name "accounts" \
  --index-name "display_name_index" \
  --key-condition-expression "display_name = :display_name" \
  --expression-attribute-values '{":display_name":{"S":"person"}}'
{
    "Count": 1,
    "Items": [
        {
            "created_at": {
                "N": "1550778260030"
            },
            "display_name": {
                "S": "person"
            }
            "updated_at": {
                "N": "1550778260030"
            }
        }
    ],
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

如果我将non_key_attributes更改为包含info,它将返回完整的信息blob,而我可以使用projection-expression中的info.email来检索该字段:

{
    "Count": 1,
    "Items": [
        {
            "info": {
                "M": {
                    "email": {
                        "S": "person@example.com"
                    }
                }
            }
        }
    ],
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

Dynamo文档确实指定了索引键必须是顶层的,但是他们没有提及必须是顶层的投影中的非键属性。因此,我认为在projection-expression中起作用的任何东西都应该在索引投影中起作用,但事实并非如此?

我对这个索引定义或查询做错了吗?还是Dynamo只是不支持嵌套非键属性作为索引投影的一部分?

2 个答案:

答案 0 :(得分:0)

我走进了同一件事。我看到您的问题没有答案。不确定我的答案是否正确,但是也许可以帮到您。

首先,我认为创建GSI非常奇怪,该API允许您添加“ info.email”的投影(这也会在索引概述页面上显示),但是再也无法检索到。

我发现在创建GSI时,您陷入了提供的属性中。 另一方面,创建LSI时,可以使用创建LSI时提供的属性。

您可以在本文档中找到有关此内容的一些信息(搜索“ Projected Attributes”): http://spadevALB-1744212699.us-northwest-1.elb.amazonaws.com

我希望您可以使用此信息来做些事情。

答案 1 :(得分:-1)

我遇到了完全相同的问题,然后尝试了完全相同的方法。 我通读了AWS文档,找不到确切的答案。 根据我的经验,我会说dynamodb不支持嵌套的非关键属性作为索引投影的一部分。

相关问题