MongoDB - 复合索引
MongoDB 提供索引以有效执行没有索引的查询 MongoDB 必须搜索每个文档以匹配非常低效的查询。索引易于遍历并根据指定的字段存储已排序的文档。与对单个字段进行索引的单字段索引不同,复合索引按升序或降序对文档的多个字段进行索引,即它会对一个字段的数据进行排序,然后在其中对文档的数据进行排序另一个领域。或者换句话说,复合索引是单个索引字段包含对多个字段的引用的那些索引。在 MongoDB 中,复合索引可以包含单个散列索引字段,如果一个字段包含多个散列索引字段,那么 MongoDB 会报错。
如何创建复合索引?
在 MongoDB 中,我们可以使用 createIndex() 方法创建复合索引。
句法:
db.collection.createIndex({
这里
例如:
{"id":"1", "product":"chips", "manufacturer":"lays", "price":20}
{"id":"2", "product":"pringles", "manufacturer":"Kellogg's", "price":99}
{"id":"3", "product":"Doritos", "manufacturer":"lays", "price":10}
{"id":"4", "product":"cheetos", "manufacturer":"lays", "price":473}
{"id":"5", "product":"coldrink", "manufacturer":"mountain-dew", "price":20}
在上面的四个文档中,我们可以按照任何顺序在字段的名称和年龄上对它们进行索引。假设我们通过 db.collection.createIndex(manufacturer:1, price:-1) 创建一个复合索引,索引看起来有点像这样
如图所示,先将家乐氏、乐事和山露按字母顺序排序,然后将价格排序在其中。这里索引将首先按照制造商名称的升序进行,然后按照价格的降序进行索引。所以我们可以有效地运行像 db.collection.find().sort(manufacturer:1, price: -1) 这样的查询,因为我们已经为此创建了一个索引。
例子 -
在以下示例中,我们正在使用:
Database: GeeksforGeeks
Collection: products
Documents: Six documents that contain the details of the employees in the form of field-value pairs.
创建关于制造和价格的复合指数:
在这里,我们按升序创建制造指数,然后按降序创建价格指数。
db.products.createIndex({manufacturer:1, price:-1})
创建产品、制造商和价格的复合索引:
在这里,我们按升序在产品上创建一个索引,然后将按制造商的升序对它进行排序,然后再按价格对它进行排序
db.products.createIndex({product:1,manufacturer:1,price:1})
使用复合索引排序
我们可以在创建的索引上使用 MongoDB 的 sort()函数,因为索引包含有序记录,MongoDB 可以从与 Sort 表达式匹配(使用前缀匹配)的索引中获取排序结果。如果 MongoDB 无法使用索引来获取排序顺序,它会在返回结果之前对它使用的数据执行阻塞排序操作并处理所有输入文档以进行排序。
如果排序键匹配索引前缀,MongoDB 可以使用索引对查询结果进行排序。前缀是由索引键模式的一个或多个键组成的子集。
例如,假设我们通过以下方式创建复合索引
db.data.createIndex({a:1, b: -1, c:1})
然后我们有以下前缀,我们创建的索引用于排序 -
{a:1}
{a:1,b:-1}
{a:1,b-1,c:1}
Example | prefix |
---|---|
db.data.find().sort({a: 1}) | {a: 1} |
db.data.find().sort({a: -1}) | {a: 1} |
db.data.find().sort({a: 1, b: -1}) | {a: 1, b: -1} |
db.data.find().sort({a: -1, b: 1}) | {a: 1, b: -1} |
db.data.find().sort({a: 1, b: -1, c: 1}) | {a: 1, b: -1, c: 1} |
因此,对于上表中的所有示例,MongoDB 将使用我们创建的索引,但不会使用 db.data.find().sort({a: -1, b: -1}) 或 db.data.find().sort ({a: 1, b: 1}) 因为它们不匹配这两个的任何前缀 MongoDB 必须执行阻塞排序。
我们也可以使用像 {b: -1, c: 1} 这样的非前缀进行排序,但为此,我们必须在前面的前缀键上加上相等性。例如
db.data.find({a: 6}).sort({b: -1, c: 1})
这里我们在键 'a' 上放置了一个相等条件,现在它将使用前缀 {a: 1, b: -1, c: 1}
例子:
db.products.find().sort({manufacturer:1,price:-1})
在上面的例子中,因为我们的排序键模式有制造:1,价格:-1 这类似于第二个索引制造_1_价格_-1 键,因此这个索引将用于获取结果而不是再次进行排序。