如果您的集合在其前缀上同时包含复合索引和索引(例如{a:1,b:1}和 {a:1}),如果两个索引都没有稀疏或唯一约束,那么您可以删除前缀上的索引(例如{ a:1})。 MongoDB将在所有使用前缀索引的情况下使用复合索引。
约束如何产生影响?
答案 0 :(得分:1)
最好通过矛盾的例子来解释。
1)假设您有一个稀疏的复合索引{a, b}
和一个常规索引{a}
,那么文档
{ a : null, foo : "bar" }
不会成为稀疏索引的一部分,但会在常规{a}
索引中编入索引。因此,使用稀疏索引无法找到{ a : null }
的文档,但可以使用常规索引找到它们(作为旁注,如果存在许多此类文档,则树变得不平衡且速度慢。)
2)假设您有一个复合{a, b}
索引和一个唯一的{a}
索引,那么以下两个文档将违反{a}
索引的唯一约束,但不会违反该复合词index,即使您将其转换为唯一索引:
{ a : 1, b : 1 }
{ a : 1, b : 2 } // the {a,b} tuple is different, but a isn't unique
因此,唯一a
索引的存在或不存在决定了是否可以插入第二个文档。
3)同样,{a, b}
元组的唯一性并不仅仅意味着a
的唯一性,等等。您可以找到所有组合的矛盾,除非两个索引既不稀疏也不具有唯一约束。