首页 > 解决方案 > 子字段上的索引能否涵盖对该字段投影的查询?

问题描述

想象一下,您有一个如下架构:

[{
  name: "Bob",
  naps: [{
    time: 2019-05-01T15:35:00,
    location: "sofa"
  }, ...]
 }, ...
]

这么多人,每个人都有几十次小睡。您想找出“人们在哪天打盹最多?”,所以您索引naps.time,然后查询:

aggregate([
  {$unwind: naps}, 
  {$group: { _id: {$day: "$naps.time"}, napsOnDay: {"$sum": 1 } }
])

但是当这样做时explain(),mongo 告诉我在这个查询中没有使用索引,而时间Date字段上的索引显然可能是。为什么是这样?如何让 mongo 使用索引进行更优化的查询?

标签: mongodbmongodb-queryaggregation-framework

解决方案


索引存储指向实际文档的指针,并且只能在处理材料文档(即实际存储在磁盘上的文档)时使用。

$match或者$sort不改变实际文档,因此可以在这些阶段使用索引。

相反,$unwind$group或任何其他改变实际文档表示的阶段基本上会失去索引和材料文档之间的联系。

此外,当没有 处理这些阶段时$match,您基本上是在说您要处理整个集合。如果要处理整个集合,则使用索引毫无意义。


推荐阅读