您已经定义了访问模式,并设计了一个DynamoDB数据模型来实现访问模式。现在,您可以在DynamoDB数据库中查询分层数据。作为节省成本和确保性能的最佳实践,以下示例仅使用查询操作而不使用SCAN。
如何查找组件的祖先
要查找CM8组件的祖先(父母、祖父母、曾祖父母等),请使用ComponentId=“CM8”查询基表。查询将返回以下记录。
ComponentId |
ParentId |
GraphId |
Path |
---|---|---|---|
CM8 |
CM4 |
CM1#1 |
CM1|CM2|CM4|CM8 |
若要减小结果数据的大小,可以使用投影表达式仅返回Path属性。
Path |
---|
CM1|CM2|CM4|CM8 |
现在,使用管道(“|”)分割路径,并获取第一个N-1组件以获取祖先。
查询结果:CM8的祖先是CM1、CM2、CM4。
如何查找组件的直接子级
要获取给定组件CM2的所有直接子级或下游一级组件,请使用ParentId=“CM2”查询GSI1。查询将返回以下记录。
ParentId |
ComponentId |
---|---|
CM2 |
CM4 CM5 |
查询结果:CM2的直接子级是CM4和CM5。
如何使用顶级组件查找所有下游子组件
要获取顶级组件CM1的所有子组件或下游组件。使用GraphId=“CM1#1”和begins_with(“Path”,“CM1|”)查询GSI2,并使用带有ComponentId的投影表达式。它将返回与该树相关的所有组件。
此示例有一棵树,其中CM1是顶部组件。实际上,在同一个表中可能有数百万个顶级组件。
GraphId |
ComponentId |
---|---|
CM1#1 |
CM2 CM3 CM4 CM5 CM8 CM9 CM10 CM6 CM7 |
查询结果:CM1的所有下游组件均为CM2、CM3、CM4、CM5、CM8、CM9、CM10、CM6和CM7。
如何使用中级组件查找所有下游子组件
要递归获取给定组件CM2的所有子组件或下游组件,您有两个选项。您可以逐层递归查询,也可以查询GSI2索引。
选项1
逐级递归地查询GSI1,直到到达子组件的最后一级。
1.使用ParentId=“CM2”查询GSI1。它将返回以下记录。
ParentId |
ComponentId |
---|---|
CM2 |
CM4 CM5 |
2.再次使用ParentId=“CM4”查询GSI1。它将返回以下记录。
ParentId |
ComponentId |
---|---|
CM4 |
CM8 CM9 |
3.再次使用ParentId=“CM5”查询GSI1。它将返回以下记录。
ParentId |
ComponentId |
---|---|
CM5 |
CM10 |
继续循环:查询每个ComponentId,直到达到最后一级。当使用ParentId=“<ComponentId>”的查询不返回任何结果时,上一个结果来自树的最后一级。
4.合并所有结果。结果=[CM4,CM5]+[CM8,CM9]+[CM10]=[CM4、CM5、CM8、CM9、CM10]
查询结果:CM2的所有下游组件均为CM4、CM5、CM8、CM9和CM10。
选项2
查询GSI2,它存储顶级组件(汽车或CM1)的分层树。
1.首先,找到CM2的顶级组件或顶级祖先和路径。为此,使用ComponentId=“CM2”查询基表,以在层次树中查找该组件的路径。选择GraphId和Path属性。查询将返回以下记录。
GraphId |
Path |
---|---|
CM1#1 |
CM1|CM2 |
2.使用GraphId=“CM1#1”AND BEGINS_WITH(“Path”,“CM1|CM2|”)查询GSI2。查询将返回以下结果。
GraphId |
Path |
ComponentId |
---|---|---|
CM1#1 |
CM1|CM2|CM4 CM1|CM2|CM5 CM1|CM2|CM4|CM8 CM1|CM2|CM4|CM9 CM1|CM2|CM5|CM10 |
CM4 CM5 CM8 CM9 CM10 |
3.选择ComponentId属性以返回CM2的所有子组件。
查询结果:CM2的所有子组件均为CM4、CM5、CM8、CM9和CM10。
最新内容
- 1 day 19 hours ago
- 1 day 19 hours ago
- 4 days 21 hours ago
- 5 days 10 hours ago
- 6 days 21 hours ago
- 1 week ago
- 1 week ago
- 1 week ago
- 1 week ago
- 1 week ago