db.collection.createIndexes()

在本页面

定义

  • db.collection. createIndexes([*keyPatterns,]options)

    • version 3.2 中的新内容。

在集合上创建一个或多个索引。

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

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

选项

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

重要

为 db.collection.createIndexes()指定选项时,这些选项适用于所有指定的索引。对于 example,如果指定了排序规则选项,则所有创建的索引都将包含该排序规则。 如果尝试使用不兼容的选项创建索引,db.collection.createIndexes()将_return 错误。有关更多信息,请参阅选项说明。

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

所有索引类型的选项

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

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

整理选项

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

  • 文本索引,

  • 2 d索引和

  • geoHaystack索引。

    建议

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

整理和索引使用

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

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

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

    建议

    通过指定12的归类strength,可以创建 case-insensitive 索引。 1的整理strength的索引是变音符号和 case-insensitive。

与其他索引选项不同,您可以使用不同的排序规则在同一 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在数字字段scoreprice以及 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" } )

文本索引的选项

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

2dsphere 索引的选项

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

2d 索引的选项

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

geoHaystack 索引的选项

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

wildcard索引的选项

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

行为

并发

在版本4.2中进行了更改。

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

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

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

重塑现有的索引

如果您要求db.collection.createIndexes()一个或多个已经存在的索引,MongoDB不会重新创建现有的一个或多个索引。

指数期权

非归类选项

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

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

排序规则选项

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

索引键长度限制

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

通配符索引

4.2版中的新功能。

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

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

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

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

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

    • Compound

    • TTL

    • Text

    • 2d (Geospatial)

    • 2dsphere (Geospatial)

    • Hashed

    • Unique

注意

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

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

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

例子

也可以看看

db.collection.createIndex()用于各种索引规范的示例。

创建没有选项的索引

考虑包含类似于以下内容的文档的restaurants集合:

{
    location: {
        type: "Point",
        coordinates: [-73.856077, 40.848447]
    },
    name: "Morris Park Bake Shop",
    cuisine: "Cafe",
    borough: "Bronx",
}

以下 example 在restaurants集合上创建两个索引:borough字段上的升序索引和location字段上的2 dsphere索引。

db.restaurants.createIndexes([{"borough": 1}, {"location": "2dsphere"}])

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

以下 example 在products集合上创建两个索引:manufacturer字段上的升序索引和category字段上的升序索引。两个索引都使用整理指定 locale fr和比较强度2

db.products.createIndexes( [ { "manufacturer": 1}, { "category": 1 } ],
   { collation: { locale: "fr", strength: 2 } })

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

创建一个通配符指数

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

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

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

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

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

  • 在多个特定字段路径上创建通配符索引

  • 创建排除多个特定字段路径的通配符索引

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

考虑一个集合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.createIndexes(
  [ { "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.createIndexes(
  [ { "$**" : 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.elementsproduct_attributes.resistance 字段的标量值 。

use inventory
db.products_catalog.createIndexes(
  [ { "$**" : 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.elementsproduct_attributes.resistance 字段:

use inventory
db.products_catalog.createIndexes(
  [ { "$**" : 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 指数表示数据到期。

译者:李冠飞

校对:

最后更新于