本文共 4330 字,大约阅读时间需要 14 分钟。
在 MongoDB 中,索引起到了关键作用。它类似于传统数据库中的索引,能够显著提升查询效率。如果没有索引,查询操作可能需要遍历整个集合,导致效率低下。索引是一种特殊的数据结构,它存储在易于遍历的数据集合中,对数据库表中一列或多列值进行排序。
MongoDB 的索引与 MySQL 的索引十分类似。索引通过为数据库查询提供快速访问的方式,显著提升查询效率。没有索引时,查询操作需要从集合中扫描所有文档,这种方式效率极低。索引是对数据库表中一列或多列值进行排序的数据结构,存储在一个易于遍历的数据集合中。
MongoDB 的索引原理基于以下逻辑:
假设有一个users
集合,每个文档都包含 score
属性。如果需要查询分数小于 30 的文档,在没有索引的情况下,查询需要扫描全集数据,将符合条件的文档收集到结果集中。为提高查询效率,可以对 score
建立索引。索引的创建会对指定的字段按照升序或降序进行排序,并将排序后的值存储在索引库中。这样,在查询分数小于 30 的文档时,可以直接从排序好的索引中获取分数对应的文档指针,从而快速获取所需文档。 创建索引是提升数据库性能的重要操作。以下是创建索引的基本语法:
db.集合名.createIndex(keys, options)
示例:
db.index.find();{ "_id" : 0, "name" : "cyk0", "age" : 20},{ "_id" : 1, "name" : "cyk1", "age" : 21}...>db.index.createIndex({name: 1, age: -1});{ "numIndexesBefore" : 1, "numIndexesAfter" : 2, "createdCollectionAutomatically" : false, "ok" : 1}
语法说明:
keys
表示要创建的索引对象,1 表示按升序,-1 表示按降序。options
包括以下可选参数(黄色标记为常用参数): background
:指定是否在后台创建索引,默认值为 false
。unique
:指定索引是否唯一,默认值为 false
。name
:索引名称,若不指定,MongoDB会自动生成。sparse
:若设置为 true
,索引只包含存在字段的文档。expireAfterSeconds
:指定索引的生存时间(TTL)。weights
:指定索引字段的权重值。default_language
:指定文本索引的语言,默认为英语。language_override
:指定字段名称,覆盖 language
参数的语言设置。示例:
db.index.createIndex({age: 1}, {name: 'age_index'});{ "numIndexesBefore" : 1, "numIndexesAfter" : 2, "createdCollectionAutomatically" : false, "ok" : 1}
要查看集合的索引列表,可以使用以下命令:
db.集合名.getIndexes()
要查看集合的索引大小,可以使用以下命令:
db.集合名.totalIndexSize()
要删除集合的所有索引,可以使用以下命令:
db.集合名.dropIndexes()
注意事项:
_id
索引不会被删除。要删除指定索引,可以使用以下命令:
db.index.dropIndex('索引名')
MongoDB 支持创建复合索引。复合索引是由多个字段组成的索引,类似于传统数据库的复合索引。创建复合索引的语法如下:
db.集合名.createIndex({key, key, ...})
MongoDB 的聚合功能允许用户执行高级数据分析操作,类似于 SQL 中的聚合函数。常见的聚合操作包括求和、求差、平均值等。以下是一些常用聚合表达式:
表达式 | 描述 | 示例 |
---|---|---|
$sum | 计算总和 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]]) |
$min | 获取最小值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]]) |
$max | 获取最大值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]]) |
$push | 将值加入数组 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]]) |
$addToSet | 将值加入数组(无重复) | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]]) |
$first | 获取第一个值 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]]) |
$last | 获取最后一个值 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]]) |
示例数据:
假设集合mycol
包含以下文档: [ { "_id": 1, "author": "cyk", "likes": 123 }, { "_id": 2, "author": "lyj", "likes": 456 }]
操作示例:
$count
:db.mycol.aggregate([ { $group: { _id: "$author", count: { $sum: 1 } } }])
$max
:db.mycol.aggregate([ { $group: { _id: "$author", max_likes: { $max: "$likes" } } }])
$min
:db.mycol.aggregate([ { $group: { _id: "$author", min_likes: { $min: "$likes" } } }])
$avg
:db.mycol.aggregate([ { $group: { _id: "$author", avg_likes: { $avg: "$likes" } } }])
$push
:db.mycol.aggregate([ { $group: { _id: "$author", articles: { $push: "$url" } } }])
$addToSet
:db.mycol.aggregate([ { $group: { _id: "$author", articles: { $addToSet: "$url" } } }])
$first
:db.mycol.aggregate([ { $group: { _id: "$author", first_title: { $first: "$url" } } }])
$last
:db.mycol.aggregate([ { $group: { _id: "$author", last_title: { $last: "$url" } } }])
通过合理运用 MongoDB 的索引和聚合功能,可以高效地进行数据分析和查询操作,充分发挥数据库性能。
转载地址:http://zcffk.baihongyu.com/