我有多个工作进程从巨大的mongodb集合中选择数据并执行一些复杂的计算。 MongoDB集合中的每个文档只应处理一次。 现在我使用以下技术:我每个工作人员通过.FindOneAndUpdate方法标记和选择要处理的文档。它找到一个未标记的文件,标记它并返回给工人。 FindOneAndUpdate(findAndModify)是一个原子操作,因此每个文档只选择一次。 逐个选择文档看起来效率不高。有没有办法选择100个文件,并确保文件只处理一次? 还有其他一些,可能是MongoDB并行处理大量文档的特定方法吗?
答案 0 :(得分:0)
...有趣
解决这个问题的一种方法是为您的数据实施细分。让我们假设你的馆藏中有1M个文件和100个工人,在你的结构上找到一个可以平分的字段,并为每个工人预先分配10K文件。
但是,这个过程可能过度使用,其效率实际上不会比单独查询和处理文档更好。如果在marked
字段上设置索引,则操作应该非常有效,因为mongo将知道在哪里查找未标记的文档。
我认为最安全的方法就是逐个处理它们。 Mongo的原子性处于文档级别,因此您可能无法同时锁定多个特定文档。 $isolated运营商可以帮助您,以防您找到一种方法来为您的员工分割数据。
这个another answer包含有关原子性和$ isolated运算符的有用链接。