Mongodb中的索引并行数组

Mongodb中的索引并行数组,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我开始使用MongoDb C#,但遇到了一个小问题 因此,我有一个包含2个嵌入集合(不同类型)的文档。我想搜索这两个集合的字段,但是我发现,如果我尝试索引这两个集合上的可搜索字段,我会得到“无法索引并行数组”。阅读关于多键索引的Mongodb文档,我发现这确实是一个限制 我的问题是关于这个问题的正常工作是什么?我真的不能合并这些集合,因为它们非常不同?我应该遵循什么样的模式 public class Capture { [BsonId] public Guid I

我开始使用MongoDb C#,但遇到了一个小问题

因此,我有一个包含2个嵌入集合(不同类型)的文档。我想搜索这两个集合的字段,但是我发现,如果我尝试索引这两个集合上的可搜索字段,我会得到“无法索引并行数组”。阅读关于多键索引的Mongodb文档,我发现这确实是一个限制

我的问题是关于这个问题的正常工作是什么?我真的不能合并这些集合,因为它们非常不同?我应该遵循什么样的模式

public class Capture
{
        [BsonId]
        public Guid Id { get; set; }
        ...Some other fields
        public IList<CustomerInformation> CustomerInformations { get; set; }
        public IList<VehicleLicenseDisk> VehicleLicenseDisks { get; set; }
}
公共类捕获
{
[BsonId]
公共Guid Id{get;set;}
…其他一些领域
公共IList CustomerInformation{get;set;}
公共IList车辆许可证磁盘{get;set;}
}

如果您从MongoDB的角度考虑MongoDB模式问题,而不是从编程语言对象的角度考虑,这会有所帮助。数组真的需要是数组吗?可以用具体的字段名替换它们吗?在您的情况下,为什么CustomerInformation是一个数组?捕获对象真正代表什么?例如,您可能必须将CustomerInformation拆分为一个单独的集合,其中每个记录都包含指向其所属的捕获文档的链接/引用。我不知道您试图建模的细节,但不管是什么,请忘记面向对象编程,戴上MongoDB帽子——对象会在后面出现。

如果您从MongoDB的角度考虑MongoDB模式问题,而不是从编程语言对象的角度考虑,这会有所帮助。数组真的需要是数组吗?可以用具体的字段名替换它们吗?在您的情况下,为什么CustomerInformation是一个数组?捕获对象真正代表什么?例如,您可能必须将CustomerInformation拆分为一个单独的集合,其中每个记录都包含指向其所属的捕获文档的链接/引用。我不知道您试图建模的细节,但不管是什么,请忘记面向对象编程,戴上MongoDB帽子——对象会在后面出现。

在讨论可能的解决方法之前,我只想强调一下MongoDB为什么选择对索引并行数组实施此限制。在MongoDB中索引数组时,它会创建一个多键索引,每个数组元素有一个键。因此,如果在两个数组上创建一个复合索引,一个具有M个不同值,另一个具有N个不同值,则该索引实际上具有MN个键。这是非常糟糕的-它在不同数组元素的数量上是非线性的。考虑添加或移除数组元素时维护这样一个索引所需的工作量。

好的,撇开理由不谈,为了解决这个限制,使用当前的MongoDB版本(2.6)会很有帮助,它支持索引交叉。您可以在
客户信息
车辆许可证磁盘
上创建一个索引,然后MongoDB可以使用这两个索引并将它们相交,以服务对这两个索引都有限制的查询


如果你出于任何原因,坚持MunGDB<2.6,那么你的选择要么考虑重新设计模式,要么依赖于最多使用数组字段的索引。

在讨论可能的解决方案之前,我只想强调为什么MangGDB选择了强制对并行数组进行索引的限制。在MongoDB中索引数组时,它会创建一个多键索引,每个数组元素有一个键。因此,如果在两个数组上创建一个复合索引,一个具有M个不同值,另一个具有N个不同值,则该索引实际上具有MN个键。这是非常糟糕的-它在不同数组元素的数量上是非线性的。考虑添加或移除数组元素时维护这样一个索引所需的工作量。

好的,撇开理由不谈,为了解决这个限制,使用当前的MongoDB版本(2.6)会很有帮助,它支持索引交叉。您可以在
客户信息
车辆许可证磁盘
上创建一个索引,然后MongoDB可以使用这两个索引并将它们相交,以服务对这两个索引都有限制的查询


如果出于任何原因,您一直使用MongoDB<2.6,然后,您的选择要么考虑重新设计模式,要么依赖于最多使用数组字段的索引。

我已经找到了一个关于我的问题的工作,但是仍然存在一些性能问题,我觉得这是正确的表示,因为捕获是唯一真正返回的单元。商店。另一个细节是特定于捕获的,没有它就永远不会存在。我已经阅读了大量关于嵌入与引用的资料,我认为这是一个正确的决定,但无法搜索字段导致我找到了上述解决方案和一组新问题。我已经找到了解决我的问题的方法,但仍然存在一些性能问题,我认为这是正确的表示,因为捕获是从存储中真正返回的唯一单元。另一个细节是特定于捕获的,没有它就永远不会存在。我已经阅读了大量关于嵌入与引用的资料,我认为这是一个正确的决定,但无法搜索字段会导致我找到上述解决方案和一组新的问题答案。我使用的是>2.6,但我不确定如何在嵌入式表上创建单独的索引(以及这些集合的属性)。它与x.CreateIndex(“customerinforms.FieldA”、“VehicleLicenseDisks.FieldB”)有何不同;当前出现错误的是哪一个?分别在每个上创建一个索引:x.CreateIndex(“CustomerInformation.FieldA”)和x.CreateIndex(“VehicleLicenseDisks.FieldB”)。查询计划员将知道bo