带有可选字段的MongoDB索引



我目前正在进行一个项目,使用MongoDB作为具有多个集合的数据库。我最大的收藏在未来可能不会超过10000-15000份文件,目前大约有5500份文件。我使用了8个字段来查询集合。我现在正在寻找一个索引策略。我的问题是,所有8个字段都不是强制性的,可以以不同的组合出现。这让我很难创建复合索引。有人建议如何解决这个问题吗?

我为集合想出了15个复合索引,我认为这些索引涵盖了一些最重要的查询。这些对一个系列来说太多了吗?我还定期从另一个数据源向数据库插入/更新数据,所以我担心写入性能会太慢。用户只执行读取操作。我也不确定索引对于这样"小"的集合是否有意义。对于5500个文档的实际大小,无索引查询大约需要6-8毫秒才能完成。

可能集合太小,无法得到明显的改进。但是,如果该集合预计在未来会增加,它将需要一个索引策略。

MongoDB(和许多其他数据库(支持多列/字段索引,但顺序很重要。例如,如果有3列A、B、C,并且复合索引被创建为(A、B和C(:

  • 所有使用A或A+B或A+B+C列的查询都将利用索引
  • 其余的查询不会,例如B或C、B+C或A+C

为了允许所有可能的组合,需要几个索引(这相当昂贵(。

但令人惊讶!MongoDB支持为每个文档索引多个值(使用数组(,可以利用这一点并应用名为"的模式;属性模式":https://www.mongodb.com/blog/post/building-with-patterns-the-attribute-pattern

在通过几个字段进行搜索的情况下,每个文档都可能有一个额外的属性(例如"搜索"(,这里有一个例子:

{
"name": "apple",
"kind": "fruit",
"color": "green",
"size": 33,
"search": [
{"k": "name",  "v": "apple"},
{"k": "kind",  "v": "fruit"},
{"k": "color", "v": "green"},
{"k": "size",  "v": 33}
]
}

和一个复合指数CCD_ 1。为了利用该索引,用户查询应该根据以下内容进行调整/重写:

{"name":"apple", "color": "green"}

到此:

{
"$and":[
{"search":{"$elemMatch": {"k": "name", "v": "apple"}}},
{"search":{"$elemMatch": {"k": "color", "v": "green"}}}
]
}

关于$elemMatch的更多信息https://docs.mongodb.com/manual/reference/operator/query/elemMatch/

这种模式将在包含数亿文档的集合中生成即时查询结果。

最新更新