NodeJS 布尔键上的DynamoDB查询

col17t5w  于 2023-04-11  发布在  Node.js
关注(0)|答案(1)|浏览(108)

我是DynamoDB的新手(一般来说也是noSQL的新手),在理解一些概念方面有点困难。特别是有一件事给我带来了一些问题,那就是基于布尔键查询表。
我意识到我不能在布尔键上创建主索引或辅助索引,但我不知道如何理想地索引和查询具有以下结构的表;

reportId: string (uuid)
reportText: string
isActive: boolean
category: string

我希望能够完成以下搜索:
1.直接访问特定报表(主哈希索引reportId
1.列出特定类别的报告(类别的主哈希索引)
这两个问题都很简单,但我想执行另外两个查询;
1.列出标记为isActive = true的所有报告
1.列出标记为isActive = true的特定类别的所有报告
我的第一种方法是在isActive上创建一个主hashkey索引,在category上创建一个rangekey,但我只能选择StringNumberBinary作为属性类型。
isActive存储为字符串(保存为'true'而不是布尔值true)解决了这个问题,但将字符串用于布尔值属性是可怕的。
我是不是漏掉了什么?有没有一种简单的方法可以直接在一个布尔值上查询表?

svmlkihl

svmlkihl1#

我的项目包括这个特定的场景,并且我遵循了DynamoDB在本地和全局二级索引上使用sparse indexes的最佳实践。下面是我将如何处理您的示例:

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属性设置为布尔类型(它将始终存储truefalse值),而是在报表处于活动状态时使用字符串(如“x”)或其他任何您想要的值,并在报表处于非活动状态时完全删除该属性。

UPDATE:如果您在查询时需要特定类型的排序(例如按时间顺序),请使用数字(例如UNIX时间戳)而不是“x”字符串。

相关问题