MongoDB支持在集合文档中的任意字段上创建索引,默认情况下所有的集合都有一个_id字段的索引,用户和应用可以新增索引用于查询和操作。
这里准备一些学生数据
db.students.insertMany([
{ _id: 1, name: "张三", age: 20, class: { id: 1, name: "1班" }},
{ _id: 2, name: "李四", age: 22, class: { id: 2, name: "2班" }},
{ _id: 3, name: "王五", age: 24, class: { id: 3, name: "3班" }},
]);
db.students.getIndexes();
上面我们查询了students集合中的索引列表
查询结果如下:
[ { v: 2, key: { _id: 1 }, name: '_id_' } ]
默认情况下,students集合中存在一个_id字段的索引;
db.students.createIndex({age: 1});
上面创建了age字段的正序索引,其中1代表的是按照age的值正序排序的索引,如果是-1代表的是按照age的值倒序排序的索引
db.students.getIndexes();
结果如下:
[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { age: 1 }, name: 'age_1' }
]
可以看到多了一个名称为age_1的索引
db.students.find({
age: {
$gt: 21
}
})
结果如下:
[
{ _id: 2, name: '李四', age: 22, class: { id: 2, name: '2班' } },
{ _id: 3, name: '王五', age: 24, class: { id: 3, name: '3班' } }
]
db.students.find({ age: { $gt: 21 } }).explain();
结果如下:
可以看到查询过程中会使用到索引名称为age_1的索引
db.students.createIndex({'class.name': -1});
上面创建了class字段下name字段的倒序索引,其中-1代表的是按照class字段下name字段的值倒序排序的索引,如果是1代表的是按照class字段下name字段的值正序排序的索引
注意:由于是内部文档,字段的引用中间需要使用符号(.)进行分割,索引key值两侧我们需要加上单引号
db.students.getIndexes();
结果如下:
[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { age: 1 }, name: 'age_1' },
{ v: 2, key: { 'class.name': -1 }, name: 'class.name_-1' }
]
可以看到多了一个名称为class.name_-1的索引
db.students.find({ 'class.name': '1班'})
结果如下:
[ { _id: 1, name: '张三', age: 20, class: { id: 1, name: '1班' } } ]
db.students.find({ 'class.name': '1班'}).explain();
结果如下:
可以看到查询过程中会使用到索引名称为class.name_-1的索引