我使用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,因此我认为可以执行类似的操作。
如何实现此查询?还是可以建议解决此问题的更好方法。
答案 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字节计数器,以随机值开头。