如何在设计糟糕的数据库上实时搜索值?

How to search values in real time on a badly designed database?

我有一个名为 Company 的集合,它具有以下结构:

{
    "_id" : ObjectId("57336ea1a7454c0100d889e4"),
    "currentMonth" : 62,
    "variables1": { ... },
    ...
    "variables61": { ... },
    "variables62" : {
        "name" : "Test",
        "email": "email@test.com",
         ...
    },
    "country" : "US",
}

我的需要是能够使用最新数据按名称搜索公司。我无权更改此数据结构,因为许多应用程序仍在使用它。目前我还没有找到用这个数据结构来索引这些变量的方法,这使得搜索很慢。

今天,这些文档中的每一个都可能有几兆字节,并且在这个集合中有超过 20,000 个。

我要实现的系统使用搜索引擎来索引公司名称,但为此它需要能够检测集合中的变化。

MongoDB 的 change stream 似乎是一个可行的选择,但我不确定如何使其可扩展和高效。

你有什么建议可以帮助我解决这个问题吗?对设置上述系统所需的步骤有什么建议吗?

通常使用 MongoDB 您可以向文档添加新字段,现有应用程序将简单地忽略额外的字段(尽管它们自然不会被旧代码填充)。因此:

  1. 创建一个定期执行的任务,遍历您集合中的所有文档,从其字段中找出每个文档的名称,然后将名称写入顶级字段。
  2. 在该字段上添加索引。
  3. 在您的搜索代码中,按该字段的值查找。
  4. 将计算出的名称与真实名称进行比较。如果不同,则丢弃文档。

如果名称一旦设置就不会改变,则第 1 步只需要遍历缺少顶级名称的文档,不需要第 4 步。

使用 monstache 的变更检测模式,我能够与 ElasticSearch 实时同步 MongoDB,根据当前月份执行 Filter,然后 Map 结果要索引的变量数