by Anshu Vajpayee 和 Pratik Das 于 2024 年 4 月 30 日 在 Amazon DocumentDB, 中级 (200), 技术如何做永久链接评论 分享
Amazon DocumentDB兼容 MongoDB 是一个完全托管的原生 JSON 文档数据库,旨在让您轻松且经济高效地在几乎任何规模上操作关键文档工作负载,而无需管理基础设施。Amazon DocumentDB 通过提供内置的安全最佳实践、持续备份和与其他 AWS 服务的原生集成来简化您的架构。您可以利用 Amazon DocumentDB 的向量搜索和与 Amazon SageMaker Canvas 集成,增强应用程序的生成性人工智能 (AI) 和机器学习 (ML) 能力。作为一个文档数据库,Amazon DocumentDB 使存储、查询和索引 JSON 数据变得简单。
最近,Amazon DocumentDB 增强了其索引能力,新增了对 部分索引 的支持,您可以使用它仅对满足特定索引条件的文档进行索引。在本文中,我们将引导您了解这一新索引功能的优点和用例。
与索引整个集合的普通索引不同,部分索引通过仅索引一部分文档来缩小索引范围。当您有大量查询返回的过滤表达式并且希望仅对符合特定部分过滤表达式的文档进行索引时,建议使用部分索引。部分索引可以由被索引或未被索引的字段组成。
使用部分索引的好处包括:
目前,Amazon DocumentDB 50 实例集群支持部分索引。如果您在使用 Amazon DocumentDB 36 或 40 集群,可以通过 就地主要版本升级 升级到 Amazon DocumentDB 50。
要创建部分索引,可以使用 dbcollectioncreateIndex() 方法配合 partialFilterExpression 选项,后者接受一个文档,指定过滤条件:
javascriptdblt collection namegtcreateIndex({ key1 key2 }{ partialFilterExpression lt expressiongt })
您可以使用 getIndexes() 列出带有 partialFilterExpression 的部分索引:
javascriptdblt collection namegtgetIndexes()
在部分索引中,仅当查询中的过滤谓词与 partialFilterExpression 完全匹配时,才使用索引扫描。
让我们以电子商务订单管理应用程序为例来看看部分索引的一些用例。
在这个用例中,查询仅从订单集合中提取状态为 进行中 的订单详情。字段 orderID 上的完整索引会包括状态为 进行中、已取消、已退回 和 已完成 的所有文档。在大多数情况下,状态为 进行中 的订单将占订单集合中较小的比例。
因为此查询只提取 进行中 的订单,创建部分索引更加适合。通过创建仅索引 进行中 订单的部分索引,您可以创建更小的索引并提升查询性能。可以在 orderID 字段上创建如下部分索引,仅索引状态为 进行中 的文档:
javascriptdborderscreateIndex( {orderID 1} {partialFilterExpression { status {eq InProgress} } })
使用相同过滤条件的查询现在将使用部分索引:
javascriptdbordersfind({orderID3563 status {eq InProgress}})
您还可以在部分过滤表达式中结合多个操作符。考虑另一个用例,您需要检查存在支付问题的 进行中 订单。您的查询需要检索状态为 进行中 和支付状态为 未批准 的订单。要为满足这两个条件的文档创建一个部分索引,可以使用以下代码:
javascriptdborderscreateIndex( {orderID 1} {partialFilterExpression { and [ {status {eq InProgress}} {payment {eq Not Approved}} {amount {gt 100}}] }})
javascriptdbordersfind({orderID4673 statusInProgresspayment Not Approvedamount {gt 100}})
以下查询不使用部分索引,因为索引扫描仅在查询中的过滤谓词与部分过滤表达式完全匹配时使用:
javascriptdbordersfind({orderID4673 payment Not Approved})dbordersfind({orderID4673 statusInProgresspaymentApproved})
此外,Amazon DocumentDB 中的比较查询仅在查询过滤谓词完全匹配部分过滤表达式并且数据类型相同的情况下才会使用部分索引。
javascriptdbreviewsfind({orderID4673 status InProgress amount { gt 120 } })
TTL 索引使您能够根据每个文档的年龄来删除文档。当文档达到指定的 TTL 年龄时,将从集合中删除它。现在,通过创建带有部分索引属性的 TTL 索引,可以选择性地从集合中删除文档。例如,您可能希望自动删除交付超过 180 天的订单:
javascriptdborderscreateIndex( { OrderTimestamp 1 } {expireAfterSeconds 155526000 partialFilterExpression { isDelivered { eq true } } })
通过使用唯一部分索引,您可以选择性地在集合中维护唯一性。想象一个产品例如具有多个版本的软件产品随时间发展的另一个用例。在大多数情况下,您只查询最新的活动版本,但也保留过去的非活动版本以进行历史参考或分析。您可以使用同时具有唯一和部分属性的索引来查询活动产品文档,同时保持唯一性:
javascriptdbproductscreateIndex( {productID 1} {uniquetrue partialFilterExpression { status {eq active} } })
同一 productID 可能存在多个非活动版本,但只有一个活动版本的产品会在部分索引中被索引。
在本文中,我们介绍了 Amazon DocumentDB 中的部分索引,并阐述了使用此功能的一些好处。部分索引是 Amazon DocumentDB 中一种独特的索引属性,允许您在集合中的子集文档上创建索引,基于指定的过滤条件。与覆盖整个集合的传统索引不同,部分索引用于缩小范围,从而优化特定查询的性能。
有关 Amazon DocumentDB 中部分索引的更多信息,请参见 部分索引。
Pratik Das 是 AWS 的高级产品经理。他喜欢与客户合作,帮助他们在云中构建强大的数据基础和弹性工作负载。他拥有与企业在现代化、分析和数据转型项目方面的丰富经验。
Anshu Vajpayee 是 AWS 的高级 Amazon DocumentDB 解决方案架构师,帮助客户采用 NoSQL 数据库并使用 Amazon DocumentDB 现代化应用程序。在加入 AWS 之前,他曾广泛从事关系型和 NoSQL 数据库的工作。
Loading comments