【问题标题】:How to efficiently do complex queries on MongoDB unindexed fields?如何高效地对 MongoDB 未索引字段进行复杂查询?
【发布时间】:2018-04-02 16:14:39
【问题描述】:

我正在为 Web 应用程序构建过滤功能,它应该看起来像 TFS 过滤查询的 JIRA。因此用户应该能够过滤字段内容并在过滤查询中使用逻辑运算符。

数据存在于 MongoDB 中,主要挑战是我们将过滤的字段不仅应支持严格相等,而且还应支持全文搜索,因为它们可能因每个用户而异。

简而言之,有一个嵌套对象,其中有另外三个嵌套对象,根据用户可以有不同数量的字段,字段名称也是由用户设置的,所以我们不知道。

例如集合中的文档结构可以是:

{
_id: ObjectId()
storage: {
obj_1:{}
obj_2:{}
         }
},
{
_id: ObjectId()
storage: {
obj_1:{
field_1 : val,
field_2 : val
}
obj_2:{}
         }
}

我想查询会是这样的:

find({$and:[{"storage.obj_1.field_1":{$regex: "va"}},{"storage.obj_1.var_2":"val"}]})

很遗憾,我不是数据库专家,所以我现在看到的解决方案是:

1) 使用 Elasticsearch 作为搜索引擎。 但问题是:如果我不知道我的文档结构,如何设置 Elastic 索引?

2) 在 Mongo 中使用稀疏索引。但我需要使用正则表达式进行匹配,该解决方案是否比 Elastic 更好?

所以问题是:在这种数据库结构中进行过滤的最佳方法是什么?

附言 我把这个问题放在 SO 而不是软件工程中,因为 SO 有更多的活跃成员,请保留你的反对意见以备后用

【问题讨论】:

    标签: mongodb elasticsearch


    【解决方案1】:
    1. Elasticsearch 和 MongoDB(很像关系数据库)在索引方面的行为不同:在 MongoDB 中,您需要显式索引每个字段(对于非 $text 索引)。在 Elasticsearch 中,每个字段都会自动建立索引。不要对 Elasticsearch 中的字段数量过于疯狂,因为每个字段都有一点开销(在磁盘空间方面,尽管在版本 6 中有所改进)。
    2. 一旦您拥有多个测试数据集,正则表达式通常会很慢,因为它们只能使用 specific cases 中的索引,并且您需要明确定义这些索引。也许$text 索引和搜索运算符更符合您的要求。那个也可以在集合中索引every field。如果您需要更多功能和完全为搜索而构建的系统,那么 Elasticsearch 将是更好的选择。

    【讨论】:

    • 非常感谢您的回答,我会仔细研究一下Mongo $text index。
    猜你喜欢
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    相关资源
    最近更新 更多