首页 > 解决方案 > 如何使用 MongoDB 存储和搜索大型文档?

问题描述

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

目前在我们的项目中,我们使用 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来自另一个文档,因此必须完成搜索在将文档分组/连接在一起之后)+逻辑表达式可能非常复杂。

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

亲切的问候。

标签: databasemongodbdatabase-designbigdata

解决方案


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


推荐阅读