1

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

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

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

{_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组。

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

我也尝试使用 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}

我怎么能得到那个?

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

有没有好的方法来做到这一点?

4

1 回答 1

0

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

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