2014-10-28 44 views
1

我有一个大约200M +文档的Mongo DB。每个文档都有一个“名称”字段(索引),它是一个字符串和一个“项目”字段(未编入索引),它是一个整数数组。阵列的大小可以在1到100之间。检索一个大的固定的标识符集的Mongo文档

假设我有一个包含大约1M个名称的txt文件。我需要为每个这些1M名称创建另一个包含“条目”的txt文件。

选项:

  • 通过名字在一个基于_id时间和提取物品只是迭代。
  • 创建一小组名称(比如每次100个)的“批处理”,并使用$in运算符查询数据库。之后逐个遍历文档。
  • 使用某种map-reduce来分解1M名称并并行查询它们。

什么是最有效的方法呢?

回答

1

这是很难回答,没有尝试和分析。

由于数组很小,并且假定每个名字都会被找到,那么数据库的自然顺序蛮力扫描甚至可能比您建议的任何选项都快。

使用并行扫描(http://docs.mongodb.org/manual/reference/command/parallelCollectionScan/),您可以迭代所有文档;您可以轻松地在内存中保存1M名称,并且大约每200条记录就会找到一条匹配项以写入输出文本文件。

+0

我不知道关于parallelCollectionScan,谢谢指点我。如果名称数量接近总文档数量,例如,而不是1M名称,10M名称是否会比说100K名称的效果更好,您认为parallelCollectionScan会更好吗? – user2602740 2014-10-29 01:07:49

+0

随着数量的增加,丢弃的记录百分比下降。在200M下,平行扫描将尽可能快地得到。在1记录这是关于你可以做的最糟糕的。准确地说,这些极端之间的界限以及它跨越其他解决方案的界限很难预测。我一直都很惊讶暴力解决方案对'聪明'的解决方案做得如何:大多数磁盘和内存架构都是为了处理愚蠢的顺序过程而设计的。你真的需要使用你选择的硬件进行基准测试。 – 2014-10-29 03:30:11

+0

谢谢,是的,我会仔细检查一下,看看什么是最好的。另一个问题 - 我在apidoc中看到parallelCollectionScan不适用于分片群集。你知道这是为什么吗? – user2602740 2014-10-29 15:01:35