这里准备一些学生数据
- 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.createIndex({ age: 1, name: 1 });
上面创建了age、name字段的复合索引,其中1代表的是正序排序,-1代表的是倒序排序
复合查询中可以定义多个字段(最多不能超过32个字段)作为索引,但是在查询时只有使用携带第一个索引字段作为查询条件时才会使用当前索引
db.students.getIndexes();
结果如下:

可以看到多了一个名称为age_1_name_1的索引
- db.students.find({
- age: { $gt: 21 },
- name: '李四'
- });
结果如下:
![]()
- db.students.find({
- age: { $gt: 21 },
- name: '李四'
- }).explain();
结果如下:

可以看到查询过程中会使用到索引名称为age_1_name_1的索引(查询时使用了age字段)
- db.students.find({
- age: { $gt: 21 }
- });
结果如下:

- db.students.find({
- age: { $gt: 21 }
- }).explain();
结果如下:

可以看到查询过程中会使用到索引名称为age_1_name_1的索引(查询时使用了age字段)
- db.students.find({
- name: '李四'
- });
结果如下:
![]()
- db.students.find({
- name: '李四'
- }).explain();
结果如下:

可以看到查询过程中未使用到索引名称为age_1_name_1的索引(查询时未使用age字段)
- db.students.find({
- age: { $gt: 21 },
- 'class.id': 3
- });
结果如下:
![]()
- db.students.find({
- age: { $gt: 21 },
- 'class.id': 3
- }).explain();
结果如下:

可以看到查询过程中会使用到索引名称为age_1_name_1的索引(查询时使用了age字段)