部分索引是 MongoDB 中一种特殊类型的索引,它只包含满足特定条件的文档。这种索引只包含符合给定查询条件的文档的引用,而不是整个集合。部分索引可以帮助减小索引的大小,提高查询性能,并且只在需要时使用。
1. 创建部分索引
要创建部分索引,您需要指定要索引的字段以及用于过滤文档的条件。以下是创建部分索引的一般语法:
db.collection.createIndex({ field_name: 1 }, { partialFilterExpression: { filter_condition } })
在这里,field_name
是要索引的字段的名称,filter_condition
是用于过滤文档的条件。
2. 示例
假设我们有一个 inventory
集合,其中包含产品库存数据,每个产品文档都有一个 quantity
字段表示产品数量。我们希望创建一个部分索引,只包含数量大于 0 的产品文档。
// 创建部分索引,只包含数量大于0的产品文档
db.inventory.createIndex({ quantity: 1 }, { partialFilterExpression: { quantity: { $gt: 0 } } })
现在,我们已经创建了一个部分索引,只包含数量大于0的产品文档。这意味着索引将仅包含满足这个条件的文档的引用,而不包含其他文档。这样可以减小索引的大小,并且只在查询中使用该条件时才会生效。
部分索引在需要针对某个子集的查询进行优化时非常有用,可以帮助您提高查询性能并减小索引的大小。
案例
我们将使用一个简单的示例,假设我们有一个 orders
集合,用于存储订单数据,每个订单文档都有一个 status
字段表示订单状态,以及一个 created_at
字段表示订单创建时间。我们将创建一个部分索引,只包含状态为 "pending"
的订单文档。
首先,让我们插入一些示例数据:
db.orders.insertMany([
{ order_id: 1, status: "pending", created_at: ISODate("2024-03-05T10:00:00Z") },
{ order_id: 2, status: "completed", created_at: ISODate("2024-03-05T11:00:00Z") },
{ order_id: 3, status: "pending", created_at: ISODate("2024-03-05T12:00:00Z") },
{ order_id: 4, status: "shipped", created_at: ISODate("2024-03-05T13:00:00Z") }
])
接下来,让我们为 status 字段创建一个部分索引,只包含状态为 "pending"
的订单文档:
// 创建部分索引,只包含状态为 "pending" 的订单文档
db.orders.createIndex(
{ created_at: 1 },
{ partialFilterExpression: { status: "pending" } }
)
现在,我们已经创建了一个部分索引,只包含状态为 "pending"
的订单文档。这意味着索引将仅包含满足这个条件的文档的引用,而不包含其他文档。这样可以减小索引的大小,并且只在查询中使用该条件时才会生效。
以下是一些示例查询,它们会命中这个部分索引:
- 查询所有状态为 “pending” 的订单,并按照创建时间进行排序:
db.orders.find({ status: "pending" }).sort({ created_at: 1 })
- 查询状态为 “pending” 的订单,创建时间在某个时间范围内的订单:
db.orders.find({ status: "pending", created_at: { $gte: new Date("2024-03-05T00:00:00Z"), $lte: new Date("2024-03-05T23:59:59Z") } })