MongoDB数据的并行处理。数据冲突

时间:2018-12-16 20:16:16

标签: mongodb parallel-processing

我使用mongodb DB。

问题:存在n个并行进程,每个进程都处理带有查询{data_processed: {$exists: false}}的文档,对其进行处理并更新设置{data_processed:true}。当我运行所有n进程时,有时同一文档会出现在两个或多个不同的进程中。

我认为我可以在查询中使用类似的方法来防止冲突。

each process have id from 1 to n
for process with id i, get these documents
{
  data_processed: {$exists: false},
  _id: {mod_n: i}
}
where mod_n is Modulo operation on i

我将bson默认的ObjectId用作_id,因此我认为可以执行类似的操作。

如何实现此查询?还是可以建议解决此问题的更好方法。

1 个答案:

答案 0 :(得分:1)

似乎没有简单的方法可以将_id转换为long来执行模运算。另外,您可以使用简单的字符串比较来分发处理4的最后一个字符,如果需要更多的线程,则可以减少几个最后的字符,

例如,如果要使用db.col.aggregate([ { $match: { $expr: { $in: [ { $substr: [ { $toString: "$_id" }, 23, 1 ] }, [ "0", "1", "2", "3" ] ] } } } ]) ... db.col.aggregate([ { $match: { $expr: { $in: [ { $substr: [ { $toString: "$_id" }, 23, 1 ] }, [ "c", "d", "e", "f" ] ] } } } ]) 进程运行处理,则可以尝试以下查询:

16

这可以扩展到更多的进程,如果您需要多个db.col.aggregate([ { $match: { $expr: { $in: [ { $substr: [ { $toString: "$_id" }, 22, 2 ] }, [ "00", "01" ] ] } } } ]) ,则只需输入最后两个字符,如:

hg amend

由于最后三个字符表示

,因此负载应大致均匀分布
  

3字节计数器,以随机值开头。