面试题答案
一键面试查询语句示例
假设集合名为students
,包含字段age
(年龄)、score
(分数)和嵌套文档address
(地址,其中有city
城市字段)。要查询年龄在18到25岁之间,分数大于80分,且地址城市为"Beijing"的学生数据。
db.students.find({
age: { $gte: 18, $lte: 25 },
score: { $gt: 80 },
"address.city": "Beijing"
});
索引优化
- 复合索引:创建一个复合索引,将查询中涉及的字段组合在一起。
db.students.createIndex({ age: 1, score: 1, "address.city": 1 });
- 原因:复合索引可以同时利用多个字段进行查询优化。在这个查询中,复合索引能够按照索引定义的字段顺序依次过滤数据,减少全表扫描的开销。MongoDB在使用复合索引时,会尽量使用索引的最左前缀原则,所以将最常使用的过滤条件放在索引的最左边,能更有效地利用索引。
- 单字段索引:也可以考虑对每个字段分别创建单字段索引。
db.students.createIndex({ age: 1 });
db.students.createIndex({ score: 1 });
db.students.createIndex({ "address.city": 1 });
- 原因:单字段索引对于只涉及单个字段的查询也有一定优化作用。如果应用场景中除了上述复杂查询外,还有一些只基于单个字段的查询,单字段索引能提高这些查询的性能。但相比复合索引,在处理多条件联合查询时,单字段索引的性能提升不如复合索引,因为MongoDB在使用多个单字段索引时,可能无法像使用复合索引那样高效地组合过滤条件。