如何获取不属于 GSI 的所有项目?
How to get all items which are not part of a GSI?
假设您有一个具有以下属性(所有字符串)的 dynamodb table:
userId
<- 哈希键
companyId
firstname
- 等..
在这种情况下,用户可能没有 companyId
,因此某些数据库条目可能是 empty/non-existent。
现在您使用 companyId
作为哈希键创建全局二级索引 (GSI)。
问题
是否可以使用上面的 GSI 查询所有 no companyId
的数据库条目?如果不是,还有哪些其他选项(没有 scan
)?
考虑选项
从技术上讲,您可以将所有 companyId
设置为类似 "empty"
的值,但在我看来,这会导致不那么直观的编码体验,因为您需要检查 companyId == "empty"
而不是 companyId == null
(这是检查空变量的常用且已知的方法)。
如您所见,GSI 不会索引空值。事实上,事实证明,这是一个非常有用的功能,因为当索引稀疏时它允许非常有效的索引(索引键不存在于 table 中的大多数项目)。
对于您的情况,最佳解决方案取决于没有 companyId 的项目的密度。如果大多数人没有,扫描将是您最好的朋友。另一方面,如果大多数项目确实有一个 companyId,那么您可以创建一个“空”值或创建另一个属性(即 hasNoCompany)并对其进行索引。
最后,你应该考虑为什么你需要没有公司的“所有物品”:同样,如果有很多这样的物品,扫描可能仍然更合适。
假设您有一个具有以下属性(所有字符串)的 dynamodb table:
userId
<- 哈希键companyId
firstname
- 等..
在这种情况下,用户可能没有 companyId
,因此某些数据库条目可能是 empty/non-existent。
现在您使用 companyId
作为哈希键创建全局二级索引 (GSI)。
问题
是否可以使用上面的 GSI 查询所有 no companyId
的数据库条目?如果不是,还有哪些其他选项(没有 scan
)?
考虑选项
从技术上讲,您可以将所有 companyId
设置为类似 "empty"
的值,但在我看来,这会导致不那么直观的编码体验,因为您需要检查 companyId == "empty"
而不是 companyId == null
(这是检查空变量的常用且已知的方法)。
如您所见,GSI 不会索引空值。事实上,事实证明,这是一个非常有用的功能,因为当索引稀疏时它允许非常有效的索引(索引键不存在于 table 中的大多数项目)。
对于您的情况,最佳解决方案取决于没有 companyId 的项目的密度。如果大多数人没有,扫描将是您最好的朋友。另一方面,如果大多数项目确实有一个 companyId,那么您可以创建一个“空”值或创建另一个属性(即 hasNoCompany)并对其进行索引。
最后,你应该考虑为什么你需要没有公司的“所有物品”:同样,如果有很多这样的物品,扫描可能仍然更合适。