如何减少要从mongoDB同步的文档数量

时间:2012-02-02 12:22:38

标签: mongodb mapreduce synchronization nosql

在我目前的项目中,我使用的是两个数据库。

  1. 从不同数据提供者收集数据的MongoDB实例(abt 15M文档)
  2. 另一个(关系型)数据库实例仅保存应用程序所需的数据,即MongoDB实例中的数据子集。 (abt 5M行)
  3. 作为同步过程的一部分,我需要根据关系数据库中的数据定期检查MongoDB中的新条目。

    让我们说,这是关于歌曲和艺术家的,MongoDB中的文档可能如下所示:

    {_id:1,artists:["Simon","Garfunkel"],"name":"El Condor Pasa"}
    

    同步过程的一部分是导入/更新关系数据库中已存在的艺术家的所有歌曲,这些歌曲目前约有1M名艺术家。

    那么如何从MongoDB中检索所有1M名为艺术家的歌曲进行导入?

    我的第一个想法(和尝试)是针对所有艺术家并查询每位艺术家的所有歌曲(当然,还有“艺术家”字段的索引)。但每1000名艺术家需要花费几分钟时间,这将使这个过程成为一个长跑者。

    我的第二个想法是将所有现有的艺术家写成一个单独的mongoDB集合,并且有一个超级查询,它只检索存储在那里的艺术家的歌曲。但到目前为止,我还无法根据两个集合检索数据。 这是map / reduce的一个很好的用例吗?如果是,有人可以。给我一个如何实现这一目标的提示? (我不是NoSQL的新手,但在map / reduce方面却是一个新手。) 或者这个想法是不是很疯狂,我必须坚持一个运行了好几天的过程?

    提前感谢任何提示。

1 个答案:

答案 0 :(得分:0)

如果您经常需要检查更改,请为数据添加时间戳,并将该时间戳合并到查询中。例如,如果添加“created_ts”属性,则可以查找自上次批处理运行以来创建的记录。

以下是使mongo交互更有效的一些想法:

  • 使用"in" query减少网络开销。使用艺术家ID数组的大小,以确定哪种方法最适合您的情况。
  • 只选择或读取您需要的属性,以减少网络开销。
  • 确保您的文件是艺术家indexed
  • 在Mongo服务器上,确保尽可能多的数据适合内存。无论你做什么,从磁盘检索数据都会很慢。如果它不适合内存,那么你有几个选择 - 购买更多的内存;缩小数据集(例如,您实际上不需要的drop属性);碎片;等