如何获取不属于 GSI 的所有项目?

How to get all items which are not part of a GSI?

假设您有一个具有以下属性(所有字符串)的 dynamodb table:

在这种情况下,用户可能没有 companyId,因此某些数据库条目可能是 empty/non-existent。

现在您使用 companyId 作为哈希键创建全局二级索引 (GSI)。

问题

是否可以使用上面的 GSI 查询所有 no companyId 的数据库条目?如果不是,还有哪些其他选项(没有 scan)?

考虑选项

从技术上讲,您可以将所有 companyId 设置为类似 "empty" 的值,但在我看来,这会导致不那么直观的编码体验,因为您需要检查 companyId == "empty"而不是 companyId == null(这是检查空变量的常用且已知的方法)。

如您所见,GSI 不会索引空值。事实上,事实证明,这是一个非常有用的功能,因为当索引稀疏时它允许非常有效的索引(索引键不存在于 table 中的大多数项目)。

对于您的情况,最佳解决方案取决于没有 companyId 的项目的密度。如果大多数人没有,扫描将是您最好的朋友。另一方面,如果大多数项目确实有一个 companyId,那么您可以创建一个“空”值或创建另一个属性(即 hasNoCompany)并对其进行索引。

最后,你应该考虑为什么你需要没有公司的“所有物品”:同样,如果有很多这样的物品,扫描可能仍然更合适。