我有一个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只是不支持嵌套非键属性作为索引投影的一部分?
答案 0 :(得分:0)
我走进了同一件事。我看到您的问题没有答案。不确定我的答案是否正确,但是也许可以帮到您。
首先,我认为创建GSI非常奇怪,该API允许您添加“ info.email”的投影(这也会在索引概述页面上显示),但是再也无法检索到。
我发现在创建GSI时,您陷入了提供的属性中。 另一方面,创建LSI时,可以使用创建LSI时提供的属性。
您可以在本文档中找到有关此内容的一些信息(搜索“ Projected Attributes”): http://spadevALB-1744212699.us-northwest-1.elb.amazonaws.com
我希望您可以使用此信息来做些事情。
答案 1 :(得分:-1)
我遇到了完全相同的问题,然后尝试了完全相同的方法。 我通读了AWS文档,找不到确切的答案。 根据我的经验,我会说dynamodb不支持嵌套的非关键属性作为索引投影的一部分。