Mongodb Mongo-复合索引与前缀的约束

Mongodb Mongo-复合索引与前缀的约束,mongodb,Mongodb,如果您有一个在其前缀上同时具有复合索引和索引的集合(例如,{a:1,b:1}和 {a:1}),如果两个索引都没有稀疏约束或唯一约束,则可以删除前缀上的索引(例如{ a:1})。MongoDB将在所有使用前缀索引的情况下使用复合索引 约束是如何产生差异的?这可以通过矛盾的例子得到最好的解释 1) 假设您有一个稀疏的复合索引{a,b}和一个常规索引{a},然后是文档 { a : null, foo : "bar" } 不是稀疏索引的一部分,但它在常规{a}索引中被索引。因此,使用稀疏索引无法找到具

如果您有一个在其前缀上同时具有复合索引和索引的集合(例如,{a:1,b:1}和 {a:1}),如果两个索引都没有稀疏约束或唯一约束,则可以删除前缀上的索引(例如{ a:1})。MongoDB将在所有使用前缀索引的情况下使用复合索引


约束是如何产生差异的?

这可以通过矛盾的例子得到最好的解释

1) 假设您有一个稀疏的复合索引
{a,b}
和一个常规索引
{a}
,然后是文档

{ a : null, foo : "bar" }
不是稀疏索引的一部分,但它在常规
{a}
索引中被索引。因此,使用稀疏索引无法找到具有
{a:null}
的文档,但可以使用常规索引找到它们(作为补充说明,如果存在许多这样的文档,那么树将变得不平衡且缓慢)

2) 假设您有一个复合的
{a,b}
索引和一个唯一的
{a}
索引,那么以下两个文档将违反
{a}
索引的唯一约束,而不是复合索引,即使您将其转换为唯一索引:

{ a : 1, b : 1 }
{ a : 1, b : 2 }  // the {a,b} tuple is different, but a isn't unique
因此,唯一
a
索引的存在与否决定了是否可以插入第二个文档


3) 类似地,
{a,b}
元组的唯一性并不意味着
a
的唯一性,以此类推。您可以找到所有组合的矛盾,除非两个索引既不是稀疏的,也没有唯一的约束。

TBH这取决于场景。唯一和稀疏约束实际上改变了索引的形式和内容,例如,
{a:1,b:1},{sparse:true}
在满足
db.c.find({a:1,b:1})
不同意3)如果我在{a,b}上有唯一的索引,但在{a}上没有,并且我删除了{a},这会有什么影响?对不起,但我不明白你的意思。如果在
a
上没有索引,但是在
{a,b}
上没有索引,并且删除了
{a}
(我猜您的意思是“从集合中的文档中删除名为
a
的所有字段”),那么所有
{a,b}
元组都将是
{null,b}
。如果
b
的值不唯一,则
a
值的更新将在第一次创建非唯一元组时导致错误。你可以很容易地验证或伪造我在一个小集合中所说的话,这大大简化了讨论。不要同意3)如果我在{a:1,b:1}上有唯一索引,但在{a:1}上有一个非唯一索引,并且我删除了前缀索引{a:1},那会有什么影响我找不到使用前缀索引{a:1}的查询,只有前缀索引不需要是唯一的。