一、准备工作
这里准备一些学生数据
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班" }},
]);
二、创建复合索引
1、创建索引
db.students.createIndex({ age: 1, name: 1 });
上面创建了age、name字段的复合索引,其中1代表的是正序排序,-1代表的是倒序排序
复合查询中可以定义多个字段(最多不能超过32个字段)作为索引,但是在查询时只有使用携带第一个索引字段作为查询条件时才会使用当前索引
2、查询索引
db.students.getIndexes();
结果如下:
可以看到多了一个名称为age_1_name_1的索引
三、示例1:使用姓名和年龄查询
1、执行查询
db.students.find({ age: { $gt: 21 }, name: '李四'
});
结果如下:
2、执行过程
db.students.find({ age: { $gt: 21 }, name: '李四'
}).explain();
结果如下:
可以看到查询过程中会使用到索引名称为age_1_name_1的索引(查询时使用了age字段)
四、示例2:使用年龄查询
1、执行查询
db.students.find({ age: { $gt: 21 }
});
结果如下:
2、执行过程
db.students.find({ age: { $gt: 21 }
}).explain();
结果如下:
可以看到查询过程中会使用到索引名称为age_1_name_1的索引(查询时使用了age字段)
五、示例3:使用姓名查询
1、执行查询
db.students.find({ name: '李四'
});
结果如下:
2、执行过程
db.students.find({ name: '李四'
}).explain();
结果如下:
可以看到查询过程中未使用到索引名称为age_1_name_1的索引(查询时未使用age字段)
六、示例4:使用年龄和班级查询
1、执行查询
db.students.find({ age: { $gt: 21 }, 'class.id': 3
});
结果如下:
2、执行过程
db.students.find({ age: { $gt: 21 }, 'class.id': 3
}).explain();
结果如下:
可以看到查询过程中会使用到索引名称为age_1_name_1的索引(查询时使用了age字段)