database - 如何使用 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来自另一个文档,因此必须完成搜索在将文档分组/连接在一起之后)+逻辑表达式可能非常复杂。
那么有什么棘手的解决方法吗?如果没有,您可以建议迁移到哪些其他数据库?
亲切的问候。
解决方案
好的,所以在花了一些时间测试不同的方法之后,我终于使用Elasticsearch了,因为没有办法在足够的时间内通过 MongoDB 执行请求的搜索。
推荐阅读
- javascript - 构建 Wordpress 博客存档:使用 GatsbyJS 按日期过滤
- c++ - 'dustDensity' 未被捕获
- file-upload - 使用 MSXML 在 VB6 中上传文件时内存不足 (7)
- angularjs - 是否有一种“AngularJs”方式在 dom 周围移动元素?
- odoo-11 - 如何在 Qweb 销售报告的描述记录行设置字体大小或粗体?
- c# - admob 广告未以 xamarin 形式出现在模拟器中
- java - 检查对象的列表数组中是否存在值
- c# - 如何使用 Unity 3D 在运行时读取和写入 TextAsset?
- java - 单击按钮时如何发布值?
- angular - Newbee Angular 开箱即用