H O*_*H O 10 indexing amazon-web-services nosql amazon-dynamodb
如何有效地查询Dynamodb中的嵌套属性?
我有一个如下的文档结构,它允许我将相关信息存储在文档本身(而不是引用它).
存储嵌入课程的研讨会是有意义的,因为它们可能会与课程一起被查询(它们都是课程特定的,即课程有很多研讨会,研讨会属于课程).
在我正在迁移的CouchDB中,我可以编写一个View,它将为查询生成一些嵌套属性.我知道我不能将任何不是顶级属性的东西投射到dynamodb二级索引中,所以这种方法似乎不起作用.
这让我回到了这样一个问题:如果我不能将它们用作索引中的键,如何在不扫描的情况下有效地查询嵌套属性?
例如,如果我想在纳尔逊·曼德拉剧场获得平均上座率,我怎么可以查询的值registrations,并attendees在有"曼德拉剧场"的位置,所有的讲座不用借助扫描?
{
“course_id”: “ABC-1234567”,
“course_name”: “Statistics 101”,
“tutors”: [“Cognito-sub-1”, “Cognito-sub-2”],
“seminars”: [
{
“seminar_id”: “XXXYYY-12345”,
“epoch_time”: “123456789”,
“duration”: “5400”,
“location”: “Nelson Mandela Theatre”,
“name”: “How to lie with statistics”,
“registrations”: “92”,
“attendees”: “61”
},
{
“seminar_id”: “BBBCCC-44444”,
“epoch_time”: “155555555”,
“duration”: “5400”,
“location”: “Nelson Mandela Theatre”,
“name”: “Statistical significance for dog owners”,
“registrations”: “244”,
“attendees”: “240”
},
{
“seminar_id”: “XXXAAA-54321”,
“epoch_time”: “223456789”,
“duration”: “4000”,
“location”: “Starbucks”,
“name”: “Is feral cat population growth a leading indicator for the S&P 500?”,
“registrations”: “40”
}
]
}
{
“course_id”: “CJX-5553389”,
“course_name”: “Cat Health 101”,
“tutors”: [“Cognito-sub-4”, “Cognito-sub-9”],
“seminars”: [
{
“seminar_id”: “TTRHJK-43278”,
“epoch_time”: “123456789”,
“duration”: “5400”,
“location”: “Catwoman Hall”,
“name”: “Emotional support octopi for cats”,
“registrations”: “88”,
“attendees”: “87”
},
{
“seminar_id”: “BBBCCC-44444”,
“epoch_time”: “123666789”,
“duration”: “5400”,
“location”: “Nelson Mandela Theatre”,
“name”: “Statistical significance for cat owners”,
“registrations”: “44”,
“attendees”: “44”
}
]
}
Run Code Online (Sandbox Code Playgroud)
无法为嵌套属性创建索引(即Dynamodb中的文档数据类型).
文档类型 - 文档类型可以表示具有嵌套属性的复杂结构 - 例如您可以在JSON文档中找到的.文档类型是列表和地图.
查询Api: -
查询操作仅搜索主键属性值,并支持关键属性值上的比较运算符子集,以优化搜索过程.
扫描API: -
扫描操作扫描整个表.您可以指定过滤器以应用于结果,以在完整扫描后优化返回给您的值.
为了使用Query API,需要散列键值.OP没有任何散列键值可用的信息.根据OP,数据需要通过locationDynamodb List数据类型内的属性进行查询.现在,选择是看GSI.
请阅读有关GSI的更多信息.其中一条规则是GSI只能使用顶级属性创建.因此,该位置不能用于创建索引.
因此,也排除了创建GSI以便使用Query API的可能性.
索引键属性可以包含基表中的任何顶级String,Number或Binary属性; 不允许使用其他标量类型,文档类型和集类型.
由于上述原因,location假设哈希键值不可用,则查询API不能用于基于属性获取数据.
如果散列键值可用,FilterExpression则可用于过滤数据.过滤复杂列表数据类型中存在的数据的唯一方法是CONTAINS功能.为了使用CONTAINS函数,事件中的所有属性都需要与数据匹配(即seminar_id,location,duration和所有其他属性).因此,绝对不可能使用当前数据模型来满足OP中提到的用例.
建议的替代解决方案: -
如下所述重新建模数据结构可能是解决问题的一种选择.绝对没有其他解决方案可以使用Query API来完成用例.
主要表: -
课程ID - 哈希键
seminar_id - 排序键
GSI: -
研讨会地点 - 哈希钥匙
课程ID - 排序键
在DynamoDB表中,每个键值必须是唯一的.但是,全局二级索引中的键值不必是唯一的.
现在,您可以使用GSI上的查询API来获取Seminar location等于的数据Nelson Mandela Theatre.如果您知道值,则可以在查询api中使用课程ID.查询api可能会在结果集中提供多个项目.FilterExpression如果您希望根据某些非关键属性进一步过滤数据,则可以使用.
| 归档时间: |
|
| 查看次数: |
2902 次 |
| 最近记录: |