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

JDi*_*rro 6 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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

    global_secondary_index {
        name = "display_name_index"

        hash_key = "display_name"

        projection_type = "INCLUDE"
        non_key_attributes = [
            "updated_at",
            "info.email",
            "created_at"
        ]
    }
Run Code Online (Sandbox Code Playgroud)

但是,当我查询表时,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
}
Run Code Online (Sandbox Code Playgroud)

如果我更改non_key_attributes为包含info它返回完整的信息 blob 就好了,我可以使用 a projection-expressionofinfo.email来检索该字段就好了:

{
    "Count": 1,
    "Items": [
        {
            "info": {
                "M": {
                    "email": {
                        "S": "person@example.com"
                    }
                }
            }
        }
    ],
    "ScannedCount": 1,
    "ConsumedCapacity": null
}
Run Code Online (Sandbox Code Playgroud)

Dynamo 文档确实指定索引键必须是顶级的,但他们没有提到必须是顶级的投影中的非键属性。因此,我认为在投影表达式中工作的任何东西都应该在索引投影中工作,但情况似乎并非如此?

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

小智 0

我也遇到了同样的事情。我发现您的问题没有答案。不确定我有正确的答案,但也许它可以帮助你。

首先,我认为创建 GSI 非常奇怪,API 允许您添加“info.email”的投影(这也将在索引概述页面上可见),但永远无法再次检索。

我发现在创建 GSI 时,您会卡在所提供的属性上。另一方面,创建 LSI 时,您可以使用创建 LSI 时提供的属性。

您可以在本文档中找到一些相关信息(搜索“投影属性”): https: //docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/SecondaryIndexes.html

我希望你能利用这些信息做点什么。