0

node.js中的应用程序有一个后台作业,该作业在几天内运行一次,并且:

从第 3 方接收数十万个输入对象。

对于每个输入对象:

如果mongodb中存在对应的文档,并且文档中不存在字段X,则将字段X添加到该文档中。

笔记:

  • 这个流程是一个后台同步,它的结果不是实时的,所以我们不关心这个工作会花费很多时间。

  • 通过 _id 从 mongodb 查询文档。

  • 使用 mongodb WiredTiger。

  • 假设 mongodb 中的文档数量约为 100 万。

  • mongodb 中将存在高比例的输入对象对应文档。

  • 我们预计,当这个流程运行时,在某些情况下,高百分比的文档将满足更新条件,而在某些情况下,高百分比的文档将不满足更新条件。

假设主要目的是:

  • 准确的更新

  • MongoDB性能

运行此流程的最佳方法是什么 - 在 mongodb 中处理一批文档或在 mongodb 中分别处理每个输入对象?

如果答案是在 mongodb 中处理批处理,例如:

db.mycoll.update(
    { 
        "_id" : {$in:["id1","id2","id3"...]},
        "X": {$exists: false}
    },
    {
        $set : {"X":1}
    }
);
  1. 在这种方法中存在单点故障。

  2. 哪种批量大小是最佳的?

  3. 如果高比例的文档不满足更新条件,是否会影响我们正在进行更新查询的 mongodb 性能(而不是从 mongodb 中获取并在应用程序中决定不需要更新)?在这种情况下,锁将如何工作?未更新的文档会被锁定吗?

如果答案是在 mongodb 中分别处理每个输入对象

  1. 是首选阅读每个文档,然后仅在需要时更新,还是只运行有条件的更新查询(相同的性能问题)?

  2. 应用程序应该并行运行单个对象处理函数以处理一批输入对象,还是串行运行?

谢谢!

4

0 回答 0