Node.js 基于布尔键的DynamoDB查询
我对DynamoDB(以及一般的noSQL)还不熟悉,我正在努力了解一些概念。一件特别的事情是给了我一些问题,这是关于基于布尔键查询表的问题 我意识到我不能在一个布尔键上创建一个主索引或二级索引,但我看不出我应该如何理想地索引和查询具有以下结构的表Node.js 基于布尔键的DynamoDB查询,node.js,amazon-web-services,amazon-dynamodb,amazon,nosql,Node.js,Amazon Web Services,Amazon Dynamodb,Amazon,Nosql,我对DynamoDB(以及一般的noSQL)还不熟悉,我正在努力了解一些概念。一件特别的事情是给了我一些问题,这是关于基于布尔键查询表的问题 我意识到我不能在一个布尔键上创建一个主索引或二级索引,但我看不出我应该如何理想地索引和查询具有以下结构的表 reportId: string (uuid) reportText: string isActive: boolean category: string 我希望能够完成以下搜索: 直接访问特定报表(主散列索引为reportId) 列出特定类别的报
reportId: string (uuid)
reportText: string
isActive: boolean
category: string
我希望能够完成以下搜索:
reportId
)isActive
上创建一个主hashkey索引,在category
上创建一个rangekey,但我只能选择String
,Number
的二进制
作为属性类型
将isActive
存储为字符串(另存为'true'而不是布尔值true)可以解决问题,但使用字符串作为布尔值属性很可怕
我错过什么了吗?有没有一种简单的方法可以直接在布尔值上查询表
如有任何建议,不胜感激
提前感谢。我的项目包括这个特定场景,我遵循了DynamoDB在本地和全局二级索引上使用的最佳实践。以下是我对您的示例所做的:
Table: reportId (string, hash key) || reportText (string) || isActive (string, marked as "x") || category (string)
ActiveReportsIndex (Local Secondary Index): reportID (hash key) || isActive (range key)
ActiveReportsByCategoryIndex (Global Secondary Index): category (hash key) || isActive (range key) || reportId
稀疏索引背后的思想是,只有标记为isActive:“x”的报告才会显示在索引中,因此它们所需的存储和处理应该比主表少。不要将isActive属性设置为布尔类型(它将始终存储true
或false
值),而是在报告处于活动状态时使用“x”之类的字符串或任何其他您想要的内容,并在报告处于非活动状态时完全删除该属性。有道理吗
更新:如果您在查询时需要特定类型的排序(例如按时间顺序),请使用数字(例如unix时间戳)而不是“x”字符串。这非常完美,并且很好地解决了这一问题。我没有看到有关稀疏索引的参考资料(也没有看到您包含的最佳实践链接),但似乎正是我所需要的。这确实像是对dynamo的限制,您无法基于布尔值进行查询,您必须处理自己的应用程序逻辑才能将其转换为布尔类型。如何在
ActiveReportsIndex
上创建查询以检索所有活动报告?这难道不需要扫描那个索引吗?@SankethKatta是的,没错。检索任何索引或表中的所有行都需要扫描。根据这一点,1
将是2个字节,“X”
将是1个字节@readyornot