面试题答案
一键面试索引创建
在 MongoDB 中,为了优化这类查询的性能,需要创建复合索引。
-
创建索引语句
db.collection_name.createIndex({timestamp: 1, userId: 1, productId: 1});
这里将
timestamp
放在首位,是因为大部分查询首先基于时间范围(最近一周内)进行筛选。1
表示升序索引,如果是-1
则表示降序索引。将userId
和productId
依次放在后面,这样复合索引能够覆盖查询中的多个条件。 -
原因
- 时间戳优先:因为查询主要基于时间范围,将
timestamp
作为索引的第一字段,能快速缩小查询范围。例如,如果查询最近一周内的数据,MongoDB 可以通过这个索引快速定位到符合时间范围的文档。 - 复合索引覆盖多个条件:添加
userId
和productId
到索引中,能确保索引覆盖查询中的所有关键条件。这样在查询特定用户 ID 和特定产品 ID 的文档时,MongoDB 可以直接利用索引进行查找,而不需要进行全表扫描,大大提高查询效率。
- 时间戳优先:因为查询主要基于时间范围,将
查询语句编写
- 示例查询语句
const oneWeekAgo = new Date(); oneWeekAgo.setDate(oneWeekAgo.getDate() - 7); db.collection_name.find({ timestamp: {$gte: oneWeekAgo}, userId: "specific_user_id", productId: "specific_product_id" });
- 原因
- 时间范围查询:
$gte
操作符用于指定时间戳大于或等于一周前的时间,确保只筛选出最近一周内的文档。 - 特定条件匹配:通过直接指定
userId
和productId
的精确值,结合索引,MongoDB 可以高效地定位到满足所有条件的文档。如果查询语句的条件顺序和索引顺序一致,能更好地利用索引进行查询优化,进一步提升查询性能。
- 时间范围查询: