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}
}
);
在这种方法中存在单点故障。
哪种批量大小是最佳的?
如果高比例的文档不满足更新条件,是否会影响我们正在进行更新查询的 mongodb 性能(而不是从 mongodb 中获取并在应用程序中决定不需要更新)?在这种情况下,锁将如何工作?未更新的文档会被锁定吗?
如果答案是在 mongodb 中分别处理每个输入对象:
是首选阅读每个文档,然后仅在需要时更新,还是只运行有条件的更新查询(相同的性能问题)?
应用程序应该并行运行单个对象处理函数以处理一批输入对象,还是串行运行?
谢谢!