想象一下你有一个这样的模式:
[{
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 将索引用于更优化的查询?
索引存储指向实际文档的指针,并且只能在处理材料文档(即实际存储在磁盘上的文档(时使用。
$match
或$sort
不会改变实际文档,因此可以在这些阶段使用索引。
相反,$unwind
、$group
或任何其他改变实际文档表示的阶段基本上会失去索引和材料文档之间的联系。
此外,当这些阶段在没有$match
的情况下处理时,您基本上是在说要处理整个集合。如果要处理整个集合,则使用索引是没有意义的。