🔹 1. MongoDB 对数组索引的规则
-
单层数组(
[a, b, c]
) → 可以展开(multikey index),为每个元素建索引。 -
数组包含对象(
[{x:1}, {x:2}]
) → 可以索引对象的字段。 -
数组包含数组(
[[a, b], [c, d]]
) → ❌ 不会展开内层数组,只能把整个子数组作为一个值存到索引里。
🔹 2. 例子:数组的数组
文档
普通索引尝试
👉 索引结果:
-
查询:
❌ 不会命中索引(因为索引存的是整个子数组)。
✅ 会命中索引。
🔹 3. 如何解决?
✅ 方案一:拍平成单层数组(推荐)
把内层数组展开成一维:
建索引:
查询:
👉 这是最常见的处理方式,既保持了多标签结构,又能用 multikey 索引。
✅ 方案二:存成对象数组(可索引字段)
如果你需要保留分组信息,可以用对象数组代替数组的数组:
建索引:
查询:
👉 这样就能索引到单个元素,同时还能保留分组信息。
✅ 方案三:冗余字段(索引关键字段)
如果数组嵌套太复杂,可以把需要查询的元素冗余到顶层字段:
索引 allTags
:
👉 查询时走 allTags
索引,不必解析嵌套数组。
🔹 4. 总结
-
数组的数组 → MongoDB 无法对内层数组建索引。
-
能走索引的情况:只能查询整个子数组,而不能查单个元素。
-
解决方式:
-
拍平数组(最常用,适合标签类数据)。
-
转成对象数组(保留结构化信息)。
-
冗余关键字段(牺牲空间换查询性能)。
-