mongodb - 子字段上的索引能否涵盖对该字段投影的查询?
问题描述
想象一下,您有一个如下架构:
[{
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
,您基本上是在说您要处理整个集合。如果要处理整个集合,则使用索引毫无意义。
推荐阅读
- typescript - HTMLElement 作为由 tagName 区分的联合
- python - zip输出中的值数量不正确?
- elixir - 如何在同一范围内配置实时仪表板和 JSON API?
- mysql - MySQL将触发器从更新转换为插入
- reactjs - 如何使用 d3-scale 时间获取两个日期之间的日期
- sql-server - SSIS2017 项目不从环境中获取参数
- python - MultiIndexing pandas 数据框,带有用于箱线图的加载文件名前缀
- python - RPi.GPIO 中断然后让调用者立即返回?
- powershell - 如何在 powershell 中验证 IIS web.config
- r - 使用 ggtree 时,“错误:必须从色调调色板中请求至少一种颜色”