如何使用 MongoDB 存储和搜索大型文档?

Posted

技术标签:

【中文标题】如何使用 MongoDB 存储和搜索大型文档?【英文标题】:How can I store and search through large documents with MongoDB? 【发布时间】:2019-04-08 10:56:05 【问题描述】:

嗯。这是数据库架构/架构问题。

目前在我们的项目中,我们使用 MongoDB。我们有一个数据库和一个集合。总体而言,该集合中有近 40 亿份文档(价值不变)。每个文档都有一个唯一的特定 ID,并且有很多与此 ID 相关的不同信息(这就是选择 MongoDB 的原因 - 数据完全不同,因此无模式是完美的)。


    "_id": ObjectID("5c619e81aeeb3aa0163acf02"),
    "our_id": 1552322211,
    "field_1": "Here is some information",
    "field_a": 133,
    "field_с": 561232,
    "field_b": 
            "field_0": 1,
            "field_z": [45, 11, 36]
    

该集合的目的是存储大量易于更新的数据(有些数据每天更新,有些数据每月更新一次)并搜索不同的字段以检索 ID。我们还存储每个字段的“历史”(我们也应该能够搜索历史)。因此,当开启超时更新时,我们遇到了一个称为 MongoDB 最大文档大小为 16MB 的问题。

我们尝试了几种解决方法(例如拆分文档),但它们都包含聚合中的 $group$lookup 阶段(按 id 分组,请参阅下面的示例),但两者都不能使用索引,这使得搜索多个字段的时间非常长。


    "_id": ObjectID("5c619e81aeeb3aa0163acd12"),
    "our_id": 1552322211,
    "field_1": "Here is some information",
    "field_a": 133




    "_id": ObjectID("5c619e81aeeb3aa0163acd11"),
    "our_id": 1552322211,
    "field_с": 561232,
    "field_b": 
            "field_0": 1,
            "field_z": [45, 11, 36]
    

我们也不能在这些之前使用 $match 阶段,因为搜索可以包含逻辑运算符(例如 field_1 = 'a' && field_c != 320,其中field_1 来自一个文档,而 field_c 来自另一个文档,因此必须在将文档分组/连接在一起后进行搜索)+ 逻辑表达式可能非常复杂。

那么有什么棘手的解决方法吗?如果没有,您可以建议迁移到其他哪些数据库?

亲切的问候。

【问题讨论】:

【参考方案1】:

好的,所以在花了一些时间测试不同的方法之后,我最终还是使用了 Elasticsearch,因为没有办法在足够的时间内通过 MongoDB 执行请求的搜索。

【讨论】:

以上是关于如何使用 MongoDB 存储和搜索大型文档?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb文本搜索

如何使用 MongoDb 搜索甜甜圈形状内的地理对象

如何在国家/地区最近的城市内使用 MongoDB 地理空间查询搜索文档?

如何在不同深度内搜索 MongoDB 嵌套子文档

如何在不同深度内搜索 MongoDB 嵌套子文档

如何在 mongoDB 中存储地理空间信息