如何使用 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 存储和搜索大型文档?的主要内容,如果未能解决你的问题,请参考以下文章