针对List中的子文档优化Spring MongoDB查询

时间:2015-04-23 21:01:45

标签: spring mongodb indexing subdocument

我从Spring / Mongo应用程序获得较差的查询性能,其中我有一个包含子文档列表的文档。我尝试添加复合索引来帮助解决特定查询,但是当我在子文档列表中搜索时,它们似乎没什么帮助。这一般只是一个坏主意(查询列表中的子文档),还是我可以做些什么来改善这个?我尝试从mmapv1升级到wiredTiger存储引擎,但发现对于同一查询,wiredTiger实际上慢了约30%。

我的理解是,我们的索引行数最终将成为文档行*每个列表中的子文档数,我们尝试使用复合索引进行索引。这似乎不是最理想的,但是想知道是否有某种方法我们可以优化它并且仍然将我们的子文档放在列表中。

Spring Mongo Document类的伪/简化示例:

@Document
@CompoundIndexes({
@CompoundIndex(name = "index1", def = "{ 'attr':1, 'things:attr1': 1, 'things:attr2': 1}", unique = false)
})
public class Foo {
  String attr
  List things
}

因此,MongoDB文档看起来像这样:

{
attr: value,
things: [
    {
      attr1: value1,
      attr2: value2
    },
    {
      attr1: value1,
      attr2: value2
    }
  ]
}

查询示例:

{ "$and" : [ {"attr": "value"}, { "things" : { "$elemMatch" : { "attr1" : "value2" , "attr2" : "value2"}}}]}

我的下一个最佳解决方案是将一个字段直接放在文档的根目录中,用于列表中的每个子文档,但是这将需要我们的代码库的一个痛苦且昂贵的重构,之后文档看起来像这样:

{
attr: value,
thing1:
    {
      attr1: value1,
      attr2: value2
    },
thing2:
    {
      attr1: value1,
      attr2: value2
    }
  ]
}

0 个答案:

没有答案