解决散装FindAndModify在MongoDB中(Solution to Bulk FindAn

2019-09-01 16:58发布

我的使用情况如下: - 我的MongoDB中的文档,我要送分析的集合。 是文件的格式如下 -

{_id:物件( “517e769164702dacea7c40d8”),日期: “1359911127494”,状态: “可用”,other_fields ...}

我有挑选前100个文件与状态的读取器进程日期排序提供状态修改它们:处理 。 ReaderProcess发送文件进行分析。 一旦分析完成后, 状态变为处理

目前,读者进程先取按日期排序的100个文档,然后更新状态 ,以处理在循环中的每个文件。 是否有此情况下,任何更好的/高效的解决方案?

此外,在未来的可扩展性,我们可能会多合一读卡器的过程去。 在这种情况下,我想通过一个阅读器处理拍摄100个文件不应该得到由另一位读者处理拍摄。 但是,获取和更新是分开的查询现在,所以这是非常有可能是多个读者进程挑同样的文件。

散装findAndModify(含上限)将已经解决了所有这些问题。 但不幸的是它不是在MongoDB中提供的又。 有没有办法解决这个问题?

Answer 1:

正如你提到的,目前还没有干净的方式做你想做的。 在这个时候像一个你需要的操作,最好的方法是这样的:

  1. 读者选择具有相应的限制和排序X文件
  2. 读者引号),它有自己独特的阅读器ID 1返回的文件( eg update({_id:{$in:[<result set ids>]}, state:"available", $isolated:1}, {$set:{readerId:<your reader's ID>, state:"processing"}}, false, true)
  3. 读者选择标记为处理和与它自己的阅读器ID的所有文件。 在这一点上可以保证你所得到的一套文件独占访问。
  4. Offer自3为您处理结果集)。

请注意,这甚至还可以在高并发情况下,作为一个读者永远保留不已经被其他读者保留文档(注意第2步中只能保留现有的文件和写是原子)。 我想补充有保留时间的时间戳,以及如果你希望能够超时保留(例如用于场景,读者可能会崩溃/失败)。

编辑:更多详细信息:

所有的写操作可以偶尔产生的,如果写需要相当长的时间等待的操作。 这意味着步骤2)可能看不到),步长为1标注的所有文件,除非你采取以下措施:

  • 使用适当的“W”(写入关注)值,这意味着1或更高。 这将确保在其上调用写操作的连接将等待它完成,无论它产生的。
  • 请确保你做的读取步骤2相同的连接上(仅适用于slaveOk replicasets有关启用读取)或线程,让他们保证是连续的。 前者可以在大多数驱动程序来完成与“requestStart”和“requestDone”的方法或类似(Java文档在这里 )。
    • 在$隔离标志添加到您的多更新,以确保它不能与其他写操作交错。

另请参阅有关原子/隔离的讨论意见。 我错误地以为多更新进行分离。 他们都没有,或者至少不是默认。



文章来源: Solution to Bulk FindAndModify in MongoDB
标签: mongodb nosql