MongoDB-CN-Manual
  • MongoDB中文手册|官方文档中文版
  • MongoDB用户手册说明
  • MongoDB简介
    • 入门
    • 数据库和集合
      • 视图
      • 按需物化视图
      • 封顶集合
      • 时间序列集合
    • 文档
    • BSON类型
      • Comparison and Sort Order
      • MongoDB Extended JSON (v2)
      • MongoDB Extended JSON (v1)
  • 安装 MongoDB
    • 安装MongoDB社区版
      • 在Linux上安装MongoDB社区版
      • 在macOS上安装MongoDB社区版
      • 在Windows上安装MongoDB社区版
    • 安装MongoDB企业版
      • 在Linux上安装MongoDB企业版
      • 在Mac OS安装MongoDB企业版
      • 在Windows安装MongoDB企业版
      • 使用Docker安装MongoDB企业版
    • 将社区版MongoDB升级到企业版MongoDB
    • 验证MongoDB软件包的完整性
  • The mongo Shell
    • 配置mongo Shell
    • 使用 mongo Shell帮助
    • 为mongo Shell编写脚本
    • mongo Shell中的数据类型
    • mongo Shell 快速参考
  • MongoDB CRUD操作
    • 插入文档
      • 插入方法
    • 查询文档
      • 在mongo Shell中迭代游标
      • 从查询返回的项目字段
      • 查询嵌入式文档数组
      • 查询数组
      • 查询空字段或缺少字段
      • 查询嵌入/嵌套文档
    • 更新文档
      • 更新方法
      • 聚合管道更新
    • 删除文档
      • 删除方法
    • 地理空间查询
      • 用地理空间查询查找餐馆
      • GeoJSON对象
    • 批量写入操作
    • 可重试写入
    • 可重试读取
    • SQL到MongoDB的映射图表
    • 文本搜索
      • 文本索引
      • 文本索引操作
      • 集合管道中的文本索引
      • 文本索引语言
    • Read Concern读关注
      • 读关注 "local"
      • 读关注 "available"
      • 读关注 "majority"
      • 读关注 "linearizable"
      • 读关注 "snapshot"
    • Write Concern写关注
    • MongoDB CRUD概念
      • 原子性和事务
      • 读隔离性,一致性和近因性
        • 因果一致性和读写关注
      • 分布式查询
      • 通过findAndModify进行线性化读取
      • 查询计划
      • 查询优化
        • 评估当前操作性能
        • 优化查询性能
        • 写操作性能
        • 说明结果
      • 分析查询表现
      • Tailable 游标
  • MongoDB聚合
    • 聚合管道
      • 聚合管道优化
      • 聚合管道限制
      • 聚合管道和分片集合
      • 使用 Zip Code 数据集进行聚合
      • 使用用户首选项数据进行聚合
    • Map-Reduce
      • Map-Reduce 和分片集合
      • Map-Reduce 并发
      • Map-Reduce 示例
      • 执行增量 Map-Reduce
      • 对 Map Function 进行故障排除
      • 排除 Reduce Function 问题
      • Map-Reduce转换到聚合管道
    • 聚合参考
      • 聚合管道快速参考
      • 聚合命令
      • 聚合命令对比
      • 聚合表达式中的变量
      • SQL 到聚合映射图表
  • MongoDB数据模型
    • 数据建模介绍
    • 模式验证
    • 数据模型设计
      • 一对一嵌套关系模型
  • MongoDB事务
  • MongoDB事务
    • 驱动程序 API
    • 生产注意事项
    • 生产注意事项 (分片集群)
    • 事务操作
  • MongoDB索引
    • 单字段索引
    • 复合索引
    • 多键索引
      • 多键索引范围
    • 文本索引
      • 为文本索引指定语言
      • 指定文本索引的名称
      • 用权重控制搜索结果
      • 限制扫描条目的数量
    • 通配符索引
      • 通配符索引限制
    • 2dsphere 索引
      • 查询一个2dsphere索引
    • 2d 索引
      • 创建一个2d索引
      • 查询一个2d索引
      • 2d索引内部
      • 使用球面几何计算距离
    • geoHaystack 索引
      • 创建Haystack索引
      • 查询Haystack索引
    • 哈希索引
    • 索引特性
      • TTL 索引
        • 通过设置TTL使集合中的数据过期
      • 唯一索引
      • 部分索引
      • 不分大小写索引
      • Sparse 索引
    • 在填充的集合上建立索引
      • 在副本集上建立滚动索引
      • 在分片群集上建立滚动索引
    • 索引交集
    • 管理索引
    • 衡量索引使用
    • 索引策略
      • 创建索引来支持查询
      • 使用索引对查询结果进行排序
      • 确保索引适合RAM
      • 创建以确保选择性的查询
    • 索引参考
  • MongoDB安全
    • 安全检查列表
    • 启用访问控制
    • 身份验证
      • 用户
        • 添加用户
        • 权限认证机制
          • SCRAM
            • 用x.509证书来认证客户端
    • 审计
      • 配置审计过滤器
      • 配置审计
      • 系统事件审计消息
    • 网络和配置强化
    • 安全参考
      • system.roles集合
      • system.users集合
      • 资源文档
      • 权限操作
    • 附录
      • 附录-A-用于测试的 OpenSSl CA 证书
      • 附录-B-用于测试的OpenSSL服务器证书
      • 附录-C-用于测试的OpenSSL客户端证书
  • Change Streams变更流
    • 变更流生产建议
    • 变更事件
  • MongoDB复制
    • 副本集成员
    • 副本集日志
    • 副本集数据同步
    • 副本集部署架构
    • 副本集成员配置教程
    • 副本集维护教程
    • MongoDB复制参考
  • MongoDB分片
    • 分片集群组件
    • 分片键
    • 哈希分片
    • 范围分片
    • 区
      • 管理分片区
      • 按位置细分数据
      • 用于更改SLA或SLO的分层硬件
      • 按应用或客户细分数据
      • 仅插入工作负载的分布式本地写入
      • 管理分片区
    • 使用块进行数据分区
      • 在分片集群中拆分数据块
    • 分片管理
      • 查看集群设置
    • 重启一个分片集群
    • [把一个分片集群迁移到不同的硬件](fen-pian/migrate-a -sharded-cluster-to-different-hardware.md)
    • 分片参考
  • MongoDB管理
    • 产品说明
    • 操作检查列表
    • 开发检查列表
    • 配置和维护
    • 性能
    • 数据中心意识
      • MongoDB部署中的工作负载隔离
      • 区
        • 管理分片区
        • 按位置细分数据
        • 用于更改SLA或SLO的分层硬件
        • 按应用或客户细分数据
        • 仅插入工作负载的分布式本地写入
        • 管理分片区
    • MongoDB备份方法
    • MongoDB监控
  • MongoDB存储
    • 存储引擎
      • WiredTiger 存储引擎
      • 内存存储引擎
    • 日志记录
      • 管理日志记录
        • GridFS
        • FAQ:MongoDB 存储
  • MongoDB参考
    • 运算符
      • 查询与映射运算符
        • 比较查询运算符
          • $eq
          • $gt
          • $gte
          • $in
          • $lt
          • $lte
          • $ne
          • $nin
        • 逻辑查询运算符
          • $and
          • $not
          • $nor
          • $or
        • 元素查询运算符
        • 评估查询运算符
        • 地理空间查询运算符
        • 数组查询运算符
        • 按位查询运算符
        • $comment
        • 映射运算符
      • 更新运算符
        • 字段更新运算符
        • 数组更新运算符
        • 按位更新运算符
      • 聚合管道阶段
      • 聚合管道操作符
        • $abs (aggregation)
        • $acos (aggregation)
        • $acosh (aggregation)
        • $add (aggregation)
        • $addToSet (aggregation)
        • $allElementsTrue (aggregation)
        • $and (aggregation)
        • $anyElementTrue (aggregation)
        • $arrayElemAt (aggregation)
        • $arrayToObject (aggregation)
        • $asin (aggregation)
        • $asinh (aggregation)
        • $atan (aggregation)
        • $atan2 (aggregation)
        • $atanh (aggregation)
        • $avg (aggregation)
        • $ceil (aggregation)
        • $cmp (aggregation)
        • $concat (aggregation)
        • $concatArrays (aggregation)
        • $cond (aggregation)
        • $convert (aggregation)
        • $cos (aggregation)
        • $dateFromParts (aggregation)
        • $dateToParts (aggregation)
        • $dateFromString (aggregation)
        • $literal (aggregation)
      • 查询修饰符
    • 数据库命令
      • 聚合命令
      • 地理空间命令
      • 查询和写操作命令
      • 查询计划缓存命令
      • 认证命令
      • 用户管理命令
      • 角色管理命令
      • 复制命令
      • 分片命令
      • 会话命令
      • 管理命令
      • 诊断命令
      • 免费监控命令
      • 系统事件审计命令
    • mongo Shell 方法
      • 集合方法
        • db.collection.aggregate()
        • db.collection.bulkWrite()
        • db.collection.copyTo()
        • db.collection.count()
        • db.collection.countDocuments()
        • db.collection.estimatedDocumentCount()
        • db.collection.createIndex()
        • db.collection.createIndexes()
        • db.collection.dataSize()
        • db.collection.deleteOne()
        • db.collection.deleteMany()
        • db.collection.distinct()
        • db.collection.drop()
        • db.collection.dropIndex()
        • db.collection.dropIndexes()
        • db.collection.ensureIndex()
        • db.collection.explain()
        • db.collection.find()
        • db.collection.findAndModify()
        • db.collection.findOne()
        • db.collection.findOneAndDelete()
        • db.collection.findOneAndReplace()
        • db.collection.findOneAndUpdate()
        • db.collection.getIndexes()
        • db.collection.getShardDistribution()
        • db.collection.getShardVersion()
        • db.collection.insert()
        • db.collection.insertOne()
        • db.collection.insertMany()
        • db.collection.isCapped()
        • db.collection.latencyStats()
        • db.collection.mapReduce()
        • db.collection.reIndex()
        • db.collection.remove()
        • db.collection.renameCollection()
        • db.collection.replaceOne()
        • db.collection.save()
        • db.collection.stats()
        • db.collection.storageSize()
        • db.collection.totalIndexSize()
        • db.collection.totalSize()
        • db.collection.update()
        • db.collection.updateOne()
        • db.collection.updateMany()
        • db.collection.watch()
        • db.collection.validate()
    • MongoDB中的限制与阈值
    • MongoDB系统集合
    • 词汇表
    • 默认的MongoDB端口
    • 默认的MongoDB读/写关注
    • 服务器会话
  • MongoDB FAQ
    • FAQ: MongoDB基础知识
    • FAQ: MongoDB索引
    • FAQ: MongoDB并发
    • FAQ: MongoDB分片
    • FAQ: MongoDB复制和副本集
    • FAQ: MongoDB存储
    • FAQ: MongoDB诊断
  • MongoDB 版本管理
  • 联系我们
    • Tapdata Cloud
    • MongoDB中文社区
    • 社区合作伙伴—锦木信息
由 GitBook 提供支持
在本页
  • 定义
  • 选项
  • 所有索引类型的选项
  • 整理选项
  • 文本索引的选项
  • 2dsphere 索引的选项
  • 2d 索引的选项
  • geoHaystack 索引的选项
  • wildcard索引的选项
  • 行为
  • 并发
  • 重塑现有的索引
  • 指数设置
  • 索引键长度限制
  • 例子
  • 在单个字段上创建升序索引
  • 在多个字段上创建索引
  • 使用指定的排序规则创建索引
  • 创建一个通配符指数
  • 附加信息
  1. MongoDB参考
  2. mongo Shell 方法
  3. 集合方法

db.collection.createIndex()

上一页db.collection.estimatedDocumentCount()下一页db.collection.createIndexes()

最后更新于3年前

在本页面

定义

  • db.collection. createIndex(键,选项)

    • 在集合上创建索引。

在 version 3.2 中更改:MongoDB 禁止创建version 0索引。要升级现有的 version 0 索引,请参阅Version 0 索引。

参数
类型
描述

keys

document

包含字段和 value 对的文档,其中字段是索引 key,value 描述该字段的索引类型。对于字段的升序索引,请指定的 value;对于降序索引,请指定-1的 value。 MongoDB 支持几种不同的索引类型,包括文本,地理空间和哈希索引。有关更多信息,请参见索引类型。 从 3.6 开始,您不能将*指定为索引 name。 MongoDB支持几种不同的索引类型,包括 text,geospatial和hashed索引。有关 更多信息,请参见索引类型。 在版本4.2中进行了更改: MongoDB 4.2 通配符索引 支持工作负载,用户可以在其中查询自定义字段或集合中各种字段: 要在文档中的所有字段和子字段上创建通配符索引,请指定为索引键。创建通配符索引时,不能指定降序索引键。{ "$**" : 1 },您还可以使用可选参数在索引中包括_或_排除特定字段及其子字段 wildcardProjection。 _id默认情况下,通配符索引会忽略该字段。要将_id字段包含 在通配符索引中,必须在wildcardProjection文档中明确包含它: { “ wildcardProjection”:{ “ _id”:1 “ <field>”:0 | 1 } } 除了显式包含 _id字段外,您无法在wildcardProjection文档中组合包含和排除语句 。 您可以在特定字段及其子路径上创建通配符索引,方法是将该字段的完整路径指定为索引键并附"$**"加到该路径: { "path.to.field.$**" : 1 } 特定于路径的通配符索引语法与该wildcardProjection选项不兼容 。您不能在指定的路径上指定其他包含或排除。 通配符索引键必须使用上面列出的语法之一。例如,您不能指定 复合索引键。有关通配符索引的更完整文档(包括对其创建的限制),请参阅通配符索引限制。 该featureCompatibilityVersion必须创建通配符索引。有关设置fCV的说明,请参阅 在MongoDB 4.2部署上设置功能兼容版本。mongod 4.2

options

document

可选的。包含一组控制索引创建的选项的文档。有关详细信息,请参阅选项。

db.collection.createIndex()是createIndexes命令周围的 wrapper。

要最小化 building 索引对复制集和分片群集的影响,请使用在复制集上建立索引中所述的滚动索引 build 过程。

选项

options文档包含一组控制索引创建的选项。不同的索引类型可以具有特定于该类型的附加选项。

更改了 version 3.4:添加了对整理选项的支持。

所有索引类型的选项

除非另有说明,否则以下选项适用于所有索引类型:

更改 version 3.0:dropDups选项不再可用。

参数
类型
描述

background

boolean

可选的。在MongoDB 4.2中已弃用。 对于功能兼容版本(fcv)"4.0",指定可指示MongoDB在后台构建索引。后台构建 _不会_阻止对集合的操作。默认值为 。background: true/false 在版本4.2中进行了更改。 对于功能兼容版本(fcv)"4.2",所有索引构建都使用优化的 构建过程,该过程仅在构建过程的开始和结束时才持有排他锁。其余的构建过程将产生交错的读写操作。background如果指定,MongoDB将忽略该选项。

unique

boolean

可选的。创建唯一索引,以便集合不接受索引 key value 与索引中现有 value 匹配的文档的插入或更新。 指定true以创建唯一索引。默认的 value 是false。 该选项不适用于哈希索引。

name

String

可选的。索引的 name。如果未指定,MongoDB 通过连接索引字段和 sort order 的名称来生成索引 name。 从4.2版开始,对于featureCompatibilityVersion设置为"4.2"或更大的版本,MongoDB删除了 最大127个字节的限制。在早期版本或将featureCompatibilityVersion(fCV)设置为MongoDB的版本 中 ,索引名称必须位于内 。Index Name Length "4.0" limit

partialFilterExpression

document

可选的。如果指定,则索引仅 references 与匹配过滤器表达式的文档。有关更多信息,请参见部分索引。 过滤器表达式可以包括: 等式表达式(即:field: value或使用$eq operator), $exists:true表达式, $gt,$gte,$lt,$lte表达式, $type表达式, $and operator 仅 top-level 您可以指定所有 MongoDB 索引类型的partialFilterExpression选项。 version 3.2 中的新内容。

sparse

boolean

可选的。如果true,则索引仅使用指定字段 references 文档。这些索引使用较少的空间,但在某些情况下(特别是排序)表现不同。默认的 value 是false。有关更多信息,请参见稀疏索引。 在 version 3.2 中更改:从 MongoDB 3.2 开始,MongoDB 提供了创建部分索引的选项。部分索引提供了稀疏索引功能的超集。如果您使用 MongoDB 3.2 或更高版本,则部分索引应优先于稀疏索引。 version 2.6 中更改:2 dsphere索引默认为稀疏,并忽略此选项。对于包含2dsphere index key(s)的复合索引以及其他类型的键,只有2dsphere索引字段确定索引是否引用文档。 2 d,geoHaystack和文本索引的行为与2 dsphere索引类似。

expireAfterSeconds

integer

可选的。将 value(以秒为单位)指定为TTL,以控制 long MongoDB 如何保留此集合中的文档。有关此功能的更多信息,请参见通过设置 TTL 使集合中的数据过期。这仅适用于TTL索引。

storageEngine

document

可选的。允许用户在_创建索引时以 per-index 为基础配置存储引擎。 storageEngine选项应采用以下形式: storageEngine: { <storage-engine-name>: <options> } 在验证 creating 索引时指定的存储引擎 configuration 选项,并在复制期间记录到OPLOG以支持具有使用不同存储引擎的成员的副本_set。 version 3.0 中的新内容。

整理选项

version 3.4 中的新内容。

警告

MongoDB 3.2 和早期版本不支持排序规则。在 MongoDB 3.2 及更早版本中,不要使用不受支持的排序规则选项创建索引,因为这会阻止升级到 3.4,这将强制执行更严格的索引选项验证。

参数
类型
描述

collation

document

可选的。指定索引的整理。 整理允许用户为 string 比较指定 language-specific 规则,例如字母和重音标记的规则。 如果已在集合 level 中指定了排序规则,则: 如果在创建索引时未指定排序规则,MongoDB 将使用集合的默认排序规则创建索引。 如果在创建索引时指定了排序规则,MongoDB 将使用指定的排序规则创建索引。 排序规则选项具有以下语法: 排序规则:{ locale:<string>, caseLevel:<boolean>, caseFirst:<string>, strength:<int>, numericOrdering:<boolean>, alternate:<string>, maxVariable:<string>, backwards :<boolean> } 指定排序规则时,locale字段是必填字段;所有其他校对字段都是可选的。有关字段的说明,请参阅整理文件。 version 3.4 中的新内容。

以下索引仅支持简单的二进制比较,不支持整理:

  • 文本索引,

  • 2 d索引和

  • geoHaystack索引。

    建议

    要在具有 non-simple 归类的集合上创建text,2d或geoHaystack索引,必须在创建索引时显式指定{collation: {locale: "simple"} }。

整理和索引使用

如果已在集合 level 中指定了排序规则,则:

  • 如果在创建索引时未指定排序规则,MongoDB 将使用集合的默认排序规则创建索引。

  • 如果在创建索引时指定了排序规则,MongoDB 将使用指定的排序规则创建索引。

    建议

    通过指定1或2的归类strength,可以创建不区分大小写的索引。排序规则strength的索引是 1的不区分字母也不区分大小写。

与其他索引选项不同,您可以使用不同的排序规则在同一 key(s) 上创建多个索引。要使用相同的 key pattern 但不同的排序规则创建索引,必须提供唯一的索引名称。

要使用索引进行 string 比较,操作还必须指定相同的排序规则。也就是说,如果操作指定了不同的排序规则,则具有排序规则的索引不能支持对索引字段执行 string 比较的操作。

对于 example,集合myColl在 string 字段category上有一个索引,其中包含整理 locale "fr"。

db.myColl.createIndex( { category: 1 }, { collation: { locale: "fr" } } )

以下查询操作(指定与索引相同的排序规则)可以使用索引:

db.myColl.find( { category: "cafe" } ).collation( { locale: "fr" } )

但是,以下查询操作(默认情况下使用“简单”二进制文件夹)无法使用索引:

db.myColl.find( { category: "cafe" } )

对于索引前缀键不是 strings,数组和嵌入文档的复合索引,指定不同排序规则的操作仍然可以使用索引来支持对索引前缀键的比较。

对于 example,集合myColl在数字字段score和price以及 string 字段category上具有复合索引;使用用于 string 比较的排序规则 locale "fr"创建索引:

db.myColl.createIndex(
    { score: 1, price: 1, category: 1 },
    { collation: { locale: "fr" } } )

以下操作(使用"simple"二进制排序规则进行 string 比较)可以使用索引:

db.myColl.find( { score: 5 } ).sort( { price: 1 } )
db.myColl.find( { score: 5, price: { $gt: NumberDecimal( "10" ) } } ).sort( { price: 1 } )

以下操作在索引的category字段上使用"simple"二进制排序规则进行 string 比较,可以使用索引仅满足查询的score: 5部分:

db.myColl.find( { score: 5, category: "cafe" } )

文本索引的选项

以下选项仅适用于文本索引:

参数
类型
描述

weights

document

可选的。对于文本索引,包含字段和权重对的文档。权重是 1 到 99,999 之间的整数,并且表示该字段相对于其他索引字段在分数方面的重要性。您可以为部分或全部索引字段指定权重。请参阅使用权重控制搜索结果以调整分数。默认的 value 是1。

default_language

String

可选的。对于文本索引,确定停用词列表的语言以及词干分析器和标记生成器的规则。有关可用语言,请参阅文本搜索语言;有关详细信息和示例,请参阅指定文本索引的语言。默认的 value 是english。

language_override

String

可选的。对于文本索引,集合文档中字段的 name 包含文档的覆盖语言。默认的 value 是language。有关 example,请参阅使用任何字段指定文档的语言。

textIndexVersion

integer

可选的。 text索引 version number。用户可以使用此选项覆盖默认的 version number。 有关可用版本,请参阅版本。 version 2.6 中的新内容。

2dsphere 索引的选项

以下选项仅适用于2 dsphere索引:

参数
类型
描述

2dsphereIndexVersion

integer

可选的。 2dsphere索引 version number。用户可以使用此选项覆盖默认的 version number。 有关可用版本,请参阅版本。 version 2.6 中的新内容。

2d 索引的选项

以下选项仅适用于2 d索引:

参数
类型
描述

bits

integer

可选的。对于2 d索引,存储位置数据的地理散列 value 的精度数。 bits value 的范围是 1 到 32(含)。默认的 value 是26。

min

number

可选的。对于2 d索引,经度和纬度值的下包含边界。默认的 value 是-180.0。

max

number

可选的。对于2 d索引,经度和纬度值的上包含边界。默认的 value 是180.0。

geoHaystack 索引的选项

以下选项仅适用于geoHaystack索引:

参数
类型
描述

bucketSize

number

对于geoHaystack索引,请指定要对位置值进行分组的单位数; 即: group 在同一个存储桶中的那些位置值在指定的单位数内。 value 必须大于 0。

wildcard索引的选项

以下选项仅适用于 通配符索引:

参数
类型
描述

wildcardProjection

document

可选的。允许用户使用 键模式在通配符索引中包括或排除特定字段路径。仅当在所有文档字段上创建通配符索引时,此选项才有效。如果在特定字段路径及其子字段上创建通配符索引,则无法指定此选项,例如 { "$**" : 1} { "path.to.field.$**" : 1 } 该wildcardProjection选项采用以下形式: wildcardProjection: { "path.to.field.a" : <value>, "path.to.field.b" : <value> } 该<value>可以是以下几点: 1. 1或true将该字段包括在通配符索引中。 2. 0或false从通配符索引中排除该字段。 _id默认情况下,通配符索引会忽略该字段。要将_id字段包含 在通配符索引中,必须在wildcardProjection文档中明确包含它: { "wildcardProjection" : { "_id" : 1, "<field>" : 0 1 } } 除了显式包含 _id字段外,您无法在wildcardProjection文档中组合包含和排除语句 。

行为

并发

在版本4.2中进行了更改。

对于featureCompatibilityVersion "4.2",db.collection.createIndex()使用优化的构建过程,该过程在索引构建的开始和结束时获取并持有对指定集合的排他锁。集合上的所有后续操作必须等到db.collection.createIndex()释放排他锁。db.collection.createIndex()允许在大多数索引构建期间交错进行读写操作。

对于featureCompatibilityVersion "4.0",db.collection.createIndex()使用4.2之前的索引构建过程,默认情况下会在构建过程的整个过程中获取父数据库的互斥锁。4.2之前的构建过程将阻止对数据库_及其_所有集合的所有操作,直到操作完成。background索引不使用排他锁。

有关的锁定行为的更多信息db.collection.createIndex(),请参见 填充集合的索引构建。

重塑现有的索引

如果您要求db.collection.createIndex()已经存在的索引,则MongoDB不会重新创建该索引。

指数设置

非归类选项

除排序规则选项外,如果您创建具有一组索引选项的索引,然后尝试重新创建相同的索引但具有不同的索引选项,则MongoDB不会更改选项,也不会重新创建索引。

要更改这些索引选项,请db.collection.dropIndex()在db.collection.createIndex()使用新选项运行之前 删除现有索引 。

排序规则选项

与其他索引选项不同,您可以在具有不同排序规则的同一键上创建多个索引。要创建具有相同键模式但排序规则不同的索引,必须提供唯一的索引名称。

索引键长度限制

对于将featureCompatibilityVersion(fCV)设置为"4.0"或更早版本的MongoDB 2.6至MongoDB版本, 如果现有文档的索引条目超过,则MongoDB 不会在集合上创建索引。Maximum Index Key Length

例子

在单个字段上创建升序索引

以下 example 在字段orderDate上创建升序索引。

db.collection.createIndex( { orderDate: 1 } )

如果keys文档指定了多个字段,则createIndex()创建复合指数。

在多个字段上创建索引

以下 example 在orderDate字段(在升序 order 中)和zipcode字段(在降序 order.)中)创建复合索引

db.collection.createIndex( { orderDate: 1, zipcode: -1 } )

复合索引不能包含哈希指数 component。

注意

索引的 order 对于使用索引支持sort()操作很重要。

使用指定的排序规则创建索引

version 3.4 中的新内容。

以下 example 创建名为category_fr的索引。 example 使用整理创建索引,指定 locale fr和比较强度2:

db.collection.createIndex(
    { category: 1 },
    { name: "category_fr", collation: { locale: "fr", strength: 2 } }
)

以下 example 使用整理创建名为date_category_fr的复合索引。排序规则仅适用于具有 string 值的索引键。

db.collection.createIndex(
    { orderDate: 1, category: 1 },
    { name: "date_category_fr", collation: { locale: "fr", strength: 2 } }
)

排序规则适用于值为 string 的索引键。

对于使用相同排序规则的索引键的查询或排序操作,MongoDB 可以使用索引。有关详细信息,请参阅整理和索引使用。

创建一个通配符指数

4.2版中的新功能。

mongodfeatureCompatibilityVersion必须4.2创建通配符索引。有关设置fCV的说明,请参阅 在MongoDB 4.2部署上设置功能兼容版本。

  • _id默认情况下,通配符索引会忽略该字段。要将_id字段包含 在通配符索引中,必须在wildcardProjection文档中明确包含它:

    {
      "wildcardProjection" : {
        "_id" : 1,
        "<field>" : 0|1
      }
    }

    除了显式包含 _id字段外,您无法在wildcardProjection文档中组合包含和排除语句 。

  • 通配符索引不支持以下索引类型或属性:

    • Compound

    • TTL

    • Text

    • 2d (Geospatial)

    • 2dsphere (Geospatial)

    • Hashed

    • Unique

    注意

    通配符索引与通配符文本索引不同并且不兼容 。通配符索引不能支持使用$text运算符的查询。

    有关通配符索引限制的完整文档,请参见 通配符索引限制。

有关通配符索引的完整文档,请参见 通配符索引。

以下列出了创建通配符索引的示例:

  • 在单个字段路径上创建通配符索引

  • 在所有字段路径上创建通配符索引

  • 在通配符索引覆盖率中包括特定字段

  • 从通配符索引覆盖率中忽略特定字段

在单个字段路径上创建通配符索引

考虑一个集合products_catalog,其中文档可能包含一个 product_attributes字段。该product_attributes字段可以包含任意嵌套的字段,包括嵌入式文档和数组:

{
  "_id" : ObjectId("5c1d358bf383fbee028aea0b"),
  "product_name" : "Blaster Gauntlet",
  "product_attributes" : {
     "price" : {
       "cost" : 299.99
       "currency" : USD
     }
     ...
  }
},
{
  "_id" : ObjectId("5c1d358bf383fbee028aea0c"),
  "product_name" : "Super Suit",
  "product_attributes" : {
     "superFlight" : true,
     "resistance" : [ "Bludgeoning", "Piercing", "Slashing" ]
     ...
  },
}

以下操作在product_attributes字段上创建通配符索引 :

use inventory
db.products_catalog.createIndex( { "product_attributes.$**" : 1 } )

使用此通配符索引,MongoDB索引的所有标量值 product_attributes。如果字段是嵌套的文档或数组,则通配符索引将递归到文档/数组中,并为文档/数组中的所有标量字段建立索引。

通配符索引可以支持product_attributes对其嵌套字段之一或其嵌套字段进行任意单字段查询 :

db.products_catalog.find( { "product_attributes.superFlight" : true } )
db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt : 20 } } )
db.products_catalog.find( { "product_attributes.elements" : { $eq: "water" } } )

注意

特定于路径的通配符索引语法与该wildcardProjection选项不兼容 。有关更多信息,请参见参数文档。

在所有字段路径上创建通配符索引

考虑一个集合products_catalog,其中文档可能包含一个 product_attributes字段。该product_attributes字段可以包含任意嵌套的字段,包括嵌入式文档和数组:

{
  "_id" : ObjectId("5c1d358bf383fbee028aea0b"),
  "product_name" : "Blaster Gauntlet",
  "product_attributes" : {
     "price" : {
       "cost" : 299.99
       "currency" : USD
     }
     ...
  }
},
{
  "_id" : ObjectId("5c1d358bf383fbee028aea0c"),
  "product_name" : "Super Suit",
  "product_attributes" : {
     "superFlight" : true,
     "resistance" : [ "Bludgeoning", "Piercing", "Slashing" ]
     ...
  },
}

以下操作在所有标量字段(不包括_id字段)上创建通配符索引:

use inventory
db.products_catalog.createIndex( { "$**" : 1 } )

使用此通配符索引,MongoDB可以索引集合中每个文档的所有标量字段。如果给定字段是嵌套文档或数组,则通配符索引将递归到文档/数组中,并为文档/数组中的所有标量字段建立索引。

创建的索引可以支持对集合中文档中任意字段的查询:

db.products_catalog.find( { "product_price" : { $lt : 25 } } )
db.products_catalog.find( { "product_attributes.elements" : { $eq: "water" } } )

注意

_id默认情况下,通配符索引会忽略该字段。要将_id字段包括 在通配符索引中,必须在wildcardProjection文档中明确包含它。有关更多信息,请参见参数文档。

在通配符索引覆盖率中包括特定字段

考虑一个集合products_catalog,其中文档可能包含一个 product_attributes字段。该product_attributes字段可以包含任意嵌套的字段,包括嵌入式文档和数组:

{
  "_id" : ObjectId("5c1d358bf383fbee028aea0b"),
  "product_name" : "Blaster Gauntlet",
  "product_attributes" : {
     "price" : {
       "cost" : 299.99
       "currency" : USD
     }
     ...
  }
},
{
  "_id" : ObjectId("5c1d358bf383fbee028aea0c"),
  "product_name" : "Super Suit",
  "product_attributes" : {
     "superFlight" : true,
     "resistance" : [ "Bludgeoning", "Piercing", "Slashing" ]
     ...
  },
}

以下操作将创建一个通配符索引,并使用该wildcardProjection选项在索引中仅包含product_attributes.elements和product_attributes.resistance 字段的标量值 。

use inventory
db.products_catalog.createIndex(
  { "$**" : 1 },
  {
    "wildcardProjection" : {
      "product_attributes.elements" : 1,
      "product_attributes.resistance" : 1
    }
  }
)

尽管键模式"$**"涵盖了文档中的所有字段,但该 wildcardProjection字段将索引限制为仅包含的字段。有关的完整文档wildcardProjection,请参阅 通配符索引的选项。

如果字段是嵌套文档或数组,则通配符索引将递归到文档/数组中,并索引文档/数组中的所有标量字段。

创建的索引可以支持对以下内容中包含的任何标量字段的查询wildcardProjection:

db.products_catalog.find( { "product_attributes.elements" : { $eq: "Water" } } )
db.products_catalog.find( { "product_attributes.resistance" : "Bludgeoning" } )

注意

通配符索引不支持在wildcardProjection文档中混合包含和排除语句,除非明确包含该_id字段。有关更多信息 wildcardProjection,请参见参数文档。

从通配符索引覆盖率中忽略特定字段

考虑一个集合products_catalog,其中文档可能包含一个 product_attributes字段。该product_attributes字段可以包含任意嵌套的字段,包括嵌入式文档和数组:

{
  "_id" : ObjectId("5c1d358bf383fbee028aea0b"),
  "product_name" : "Blaster Gauntlet",
  "product_attributes" : {
     "price" : {
       "cost" : 299.99
       "currency" : USD
     }
     ...
  }
},
{
  "_id" : ObjectId("5c1d358bf383fbee028aea0c"),
  "product_name" : "Super Suit",
  "product_attributes" : {
     "superFlight" : true,
     "resistance" : [ "Bludgeoning", "Piercing", "Slashing" ]
     ...
  },
}

以下操作创建一个通配符指数,并使用wildcardProjection文件索引的所有标量场的每个文档的集合中,_排除_了 product_attributes.elements和product_attributes.resistance 字段:

use inventory
db.products_catalog.createIndex(
  { "$**" : 1 },
  {
    "wildcardProjection" : {
      "product_attributes.elements" : 0,
      "product_attributes.resistance" : 0
    }
  }
)

尽管键模式"$**"涵盖了文档中的所有字段,但 wildcardProjection该字段从索引中排除了指定的字段。有关的完整文档wildcardProjection,请参阅 通配符索引的选项。

如果字段是嵌套文档或数组,则通配符索引将递归到文档/数组中,并索引文档/数组中的所有标量字段。

创建的索引可以支持对任何标量字段的查询,但 以下项除外wildcardProjection:

db.products_catalog.find( { "product_attributes.maxSpeed" : { $gt: 25 } } )
db.products_catalog.find( { "product_attributes.superStrength" : true } )

注意

通配符索引不支持在wildcardProjection文档中混合包含和排除语句,除非明确包含该_id字段。有关更多信息 wildcardProjection,请参见参数文档。

附加信息

  • 本手册的索引部分用于 MongoDB 中索引和索引的完整文档。

  • db.collection.getIndexes()查看集合的现有索引的规范。

  • 文字索引有关 creating text索引的详细信息。

  • 地理空间索引和geoHaystack 索引用于地理空间查询。

  • TTL 指数表示数据到期。

译者:李冠飞

校对:

定义
选项
行为
例子
附加信息