如何在分片mongodb群集中使用$操作检索每个键的一个(或指定计数)文档

时间:2013-01-18 17:25:23

标签: mongodb pymongo

我在mongodb(pymogno驱动程序)中遇到了我的查询问题。

这是我的问题: 我必须每天向mongodb插入(更新)大约1亿(1亿)个文件。 我放弃了使用更新相同的关键字段我必须更新附加,并修改为使用批量插入(更新性能比批量插入慢)。

这是我的数据库中的草图方案。

{_id:xxx, F1:1 , F2:"test1", TS": 2011/01}
{_id:xxx, F1:1 , F2:"test2", TS": 2011/02}
{_id:xxx, F1:2 , F2:"test1", TS": 2011/03}
{_id:xxx, F1:3 , F2:"test1", TS": 2011/04}
{_id:xxx, F1:2 , F2:"test1", TS": 2011/05}
.....
(4 billion up or more)

当我查询时,我只想通过F1(field1)检索最新的TS组。

我知道“组”聚合框架可以做到这一点,但我已经分享了我的数据库和组操作,不允许分片db。

我还尝试使用map-reduce来做到这一点,但它没有提供足够好的查询性能。

我使用的唯一查询是“$ in”操作。

db.test.find({"F1":{"$in":[1,2,3,....]}})

它检索目标数组中的所有文档,但我只想获得每个键F1的最新文档。

{_id:xxx, F1:1 , F2:"test2", TS": 2011/02}
{_id:xxx, F1:2 , F2:"test1", TS": 2011/05}
{_id:xxx, F1:3 , F2:"test2", TS": 2011/03}

我怎么能得到它?

PS。 目标数组可能包含我要批量查询的一百万个元素。

有没有好方法呢?

1 个答案:

答案 0 :(得分:0)

虽然没有单步解决这个问题的方法,因为你不能像你提到的那样在分片中使用聚合框架(即使它确实可能也不会很好),你可能想要探索像这样的解决方案:

  • 创建一个新文档集合,该集合将用作索引(但不是实际的MongoDB索引)。
  • 在此集合中,您将为每个唯一的F1值存储一个文档。该文档包含对主要集合中最新文档的引用。您可以使用条件更新来创建(必要时)索引文档或更新它。仅当时间戳小于(或等于)为该值插入的最新文档时,才使用查询查找文档并进行匹配。 (也许
  • 然后,您可以使用“索引集合”来获取每个F1值的最新文档参考。