0

我的 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
    }
  ]
}
4

0 回答 0