amazon-dynamodb - 对 Amazon DynamoDB 中的多个属性进行 OR 查询
问题描述
我有一张这样的桌子:
运输
身份证(PK) | 创建Dt | 托运人 ID | 运营商 ID | 收货人编号 |
---|---|---|---|---|
1 | 23 | 联系方式3 | 联系人2 | 联系人1 |
2 | 24 | 联系人1 | 联系人2 | 联系方式3 |
3 | 28 | 联系方式3 | 联系人2 | 联系方式4 |
我的访问模式是:
- 查找联系人为托运人、承运人或收货人的所有运输,按 createDt 排序。例如输入 contact1 应该返回记录 1、2。
如何在 DyanomoDB 中执行此操作?
我考虑过创建一个 GSI。但是我需要为每一列创建一个单独的 GSI,这意味着我需要自己在列上加入查询结果。也许有更简单的方法。
解决方案
我会在桌子上创建一个 GSI 并将您的单个记录拆分为多个记录。这会使写入稍微复杂一些,因为您编写了多个实体,但我会做这样的事情:
PK | SK | 类型 | GSI1PK | GSI1SK | 其他属性 |
---|---|---|---|---|---|
传输#1 | 传输#1 | 运输 | createDt, (shipperId, carrierId, consigneeId)... | ||
传输#1 | 联系方式#SHIP | 托运人联系方式 | 联系方式#contact3 | 运输#1#SHIP | ... |
传输#1 | 联系方式#CARR | 承运人联系 | 联系方式#contact2 | TRANSP#1#CARR | ... |
传输#1 | 联系方式#缺点 | 收货人联系方式 | 联系方式#contact1 | TRANSP#1#缺点 | ... |
- 要获取有关给定传输 ID 的所有信息,请使用
PK=TRANSP#<id>
- 要仅获取有关给定传输的基本信息,您可以执行
GetItem
onPK=TRANSP#<id> and SK=TRANSP<id>
(如果它们是相当静态的,您也可以在此处复制联系信息。) - 要获取联系人参与的所有传输,请执行
PK=CONTACT#<id> and SK starts with TRANSP
onGSI1
如果你真的需要服务器端排序,你可能会选择一个不同的GSI1SK
,可能会在它前面加上dt
值,但我可能只是做那个客户端。
推荐阅读
- c# - wslpath:在命令 vscode 中,术语 'wslpath' 未被识别为 cmdlet 的名称
- spring-webflux - 使用 Mono.zip 处理 API Calls Spring web Flux 响应中的异常
- rest - 允许对所有资源的属性进行排序?
- python - python - 通过将它们交替写入列表来制作两个列表
- python-3.x - python函数中类型变量的兴趣
- flutter - 如何将制表符包装成行
- spring - 会话复制和粘性会话在使用 Spring Boot 的集群环境中不起作用,使用 JDBCS 的 Spring HTTP 会话
- django - 为序列化程序编写一个显式的 .update() 方法
- ios - 如何在 SwiftUI 中创建核心数据管理器环境
- java - getAttribute 导致 java.lang.NullPointerException