🔹 什么是通配符索引?
在 MongoDB 里,正常的索引需要指定字段名,比如:
但是如果文档的字段是 动态生成的,你就没法预先知道该建哪个字段的索引。
👉 通配符索引 就是用 "$**"
来表示“对所有字段”或“对某个路径下所有子字段”建索引。
🔹 使用语法
1. 对整个文档的所有字段建索引
效果:inventory
集合中,所有文档的所有字段都会被索引。
查询任意字段:
都会用到索引。
2. 对某个路径下的所有字段建索引
比如文档:
只对 details
下的字段建索引:
查询:
👉 会走索引。
3. 通配符复合索引
通配符也能和普通字段一起建复合索引:
👉 查询时,先过滤 category
,再匹配 details
下的任意字段。
4. 通配符投影(限制索引字段范围)
如果只想给部分字段做通配符索引,可以加 通配符投影:
👉 这样索引只包含 color
和 size
,不会包含其他字段。
🔹 通配符索引的优缺点
✅ 优点
-
支持 动态字段 的查询优化(不需要提前知道字段名)。
-
适合存储 不规则文档,比如 IoT 数据、日志、属性扩展表。
-
可以和复合索引搭配使用。
⚠️ 缺点
-
索引体积可能很大(因为把所有字段都索引了)。
-
不支持覆盖查询(covered query)。
-
不如手动精确索引高效。
-
不能替代精细化的索引设计(只适合应急或字段特别动态的情况)。
🔹 适用场景
-
日志系统:日志字段不固定,每条日志可能有不同的 key。
-
IoT 设备上报:不同设备可能上报不同参数。
-
动态属性表:比如电商商品的属性字段(手机有屏幕尺寸,衣服有尺码)。
✅ 总结
-
通配符索引(
$**
) = 给所有字段/某个子文档所有字段建索引。 -
特别适合 字段动态、不确定 的情况。
-
但会增加存储成本,性能不如普通索引,所以只推荐在 字段不可预知 的场景下使用。