代码之家  ›  专栏  ›  技术社区  ›  Gor

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

  •  1
  • Gor  · 技术社区  · 6 年前

    我使用MongoDB数据库。

    问题 n 并行进程,每个进程使用查询获取文档 {data_processed: {$exists: false}} ,处理它们并更新设置数据已处理:真。当我跑步时 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作为\u id,所以我认为可以这样做。

    如何实现此查询?或者你能建议更好的方法来解决这个问题吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   mickl    6 年前

    似乎没有一种简单的转换方法 ObjectId 执行模运算。或者,您也可以使用简单的字符串比较来分布您的处理 _id 如果你需要更多的线程,最后几个字符,

    例如,如果要使用 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" ]  ] } } } ])
    

    由于最后三个字符代表

    3字节计数器,从随机值开始。