• MongoDB-索引-部分索引


    部分索引是 MongoDB 中一种特殊类型的索引,它只包含满足特定条件的文档。这种索引只包含符合给定查询条件的文档的引用,而不是整个集合。部分索引可以帮助减小索引的大小,提高查询性能,并且只在需要时使用。

    1. 创建部分索引

    要创建部分索引,您需要指定要索引的字段以及用于过滤文档的条件。以下是创建部分索引的一般语法:

    db.collection.createIndex({ field_name: 1 }, { partialFilterExpression: { filter_condition } })
    
    • 1

    在这里,field_name 是要索引的字段的名称,filter_condition 是用于过滤文档的条件。

    2. 示例

    假设我们有一个 inventory 集合,其中包含产品库存数据,每个产品文档都有一个 quantity 字段表示产品数量。我们希望创建一个部分索引,只包含数量大于 0 的产品文档。

    // 创建部分索引,只包含数量大于0的产品文档
    db.inventory.createIndex({ quantity: 1 }, { partialFilterExpression: { quantity: { $gt: 0 } } })
    
    • 1
    • 2

    现在,我们已经创建了一个部分索引,只包含数量大于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") }
    ])
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    接下来,让我们为 status 字段创建一个部分索引,只包含状态为 "pending" 的订单文档:

    // 创建部分索引,只包含状态为 "pending" 的订单文档
    db.orders.createIndex(
      { created_at: 1 }, 
      { partialFilterExpression: { status: "pending" } }
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5

    现在,我们已经创建了一个部分索引,只包含状态为 "pending" 的订单文档。这意味着索引将仅包含满足这个条件的文档的引用,而不包含其他文档。这样可以减小索引的大小,并且只在查询中使用该条件时才会生效。

    以下是一些示例查询,它们会命中这个部分索引:

    1. 查询所有状态为 “pending” 的订单,并按照创建时间进行排序:
    db.orders.find({ status: "pending" }).sort({ created_at: 1 })
    
    • 1
    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") } })
    
    • 1
  • 相关阅读:
    初始化我的arcolinux
    Win11环境下Android Studio中Flutter开发环境构建(逐步解决)
    MySQL常见操作
    使用$test$plusargs提高RTL验收速度
    Tomcat请求处理流程与源码浅析
    正则表达式中的元字符,量词:贪婪和非贪婪,转义符: \s: 记得使用-z --null-data: 使用ascii码中空字符来替换新行,分组:““,和‘‘
    LCR 127.跳跃训练
    uniapp开发微信小程序运行报错不知道是哪里有问题,求帮看看
    方法调用时参数的传递问题
    物理服务器安装CentOS 7操作系统
  • 原文地址:https://blog.csdn.net/galoiszhou/article/details/136470221