MST

星途 面试题库

面试题:MongoDB复合索引与查询运算符的复杂应用

有一个MongoDB集合,文档包含`name`(字符串类型)、`age`(数值类型)、`city`(字符串类型)字段。现在有这样一个需求:首先按`city`过滤,然后在每个城市内按`age`升序、`name`降序获取结果。请说明如何创建合适的复合索引,并写出对应的查询语句,解释索引的设计思路和查询运算符在此处的作用。
23.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

创建复合索引

db.collectionName.createIndex({city: 1, age: 1, name: -1})

查询语句

db.collectionName.find({city: "目标城市名称"}).sort({age: 1, name: -1})

索引设计思路

  1. 前缀索引原则:以 city 字段作为索引的第一部分,因为我们首先要按 city 过滤数据。这样可以快速定位到符合 city 条件的文档子集,大大减少后续排序操作需要处理的数据量。
  2. 排序匹配原则:接着是 age 字段升序和 name 字段降序,与查询中的排序顺序完全匹配。MongoDB 的索引可以支持按照索引字段顺序的排序操作,如果索引顺序和查询排序顺序不一致,可能无法利用索引进行高效排序,导致全表扫描。

查询运算符作用

  1. find:用于从集合中查询文档,{city: "目标城市名称"} 作为查询条件,筛选出指定城市的文档。
  2. sort:按照指定的字段顺序和方向对查询结果进行排序,{age: 1, name: -1} 分别指定了 age 字段升序和 name 字段降序。这个排序操作可以利用我们创建的复合索引来高效完成,提升查询性能。