Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sharding mongodb集群中,如何使用$in操作检索每个键一个(或指定计数)文档_Mongodb_Pymongo - Fatal编程技术网

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

在sharding mongodb集群中,如何使用$in操作检索每个键一个(或指定计数)文档,mongodb,pymongo,Mongodb,Pymongo,我在MongodBypymono驱动程序中的查询遇到了一些问题 我的问题是: 我每天必须向mongodb插入大约1亿100000000个文档。 我放弃了使用update这个我必须更新append的键字段,并且修改为使用bulkinsert更新性能比bulkinsert慢 这是我数据库中的草图方案 {_id:xxx, F1:1 , F2:"test1", TS": 2011/01} {_id:xxx, F1:1 , F2:"test2", TS": 2011/02} {_id:xxx, F1:2

我在MongodBypymono驱动程序中的查询遇到了一些问题

我的问题是: 我每天必须向mongodb插入大约1亿100000000个文档。 我放弃了使用update这个我必须更新append的键字段,并且修改为使用bulkinsert更新性能比bulkinsert慢

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

{_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)
当我查询时,我只想通过F1field1检索最新的TS组

我知道group aggregation framework可以做到这一点,但我有切分我的数据库,切分数据库中不允许组操作

我还尝试使用MapReduce来实现这一点,但它没有提供足够好的查询性能

我使用的唯一查询是$in operation

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}
我怎么能得到这个

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


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

虽然这个问题没有一个单步解决方案,因为您不能像您提到的那样在碎片中使用聚合框架,而且即使使用了聚合框架,它也可能无法很好地执行,但您可能希望探索一种解决方案,如:

创建一个新文档集合,该集合将用作索引,但不是实际的MongoDB索引。 在此集合中,每个唯一F1值将存储一个文档。文档包含对主集合中最新文档的引用。必要时,可以使用条件更新创建索引文档或对其进行更新。仅当时间戳小于或等于为该值插入的最新文档时,才使用查询查找文档并进行匹配。大概 然后使用索引集合获取每个F1值的最新文档引用。
澄清:你收集了1亿份文件。是否要根据F1的每个值的时间戳返回最新文档?是!这就像组操作一样,比如reducer=functiondoc,prev{ifdoc.TS>prev.TS{prev.TS=doc.TS;prev.F2=doc.F2;}}但该小组在sharding ClusterClearification中不起作用:每天插入1亿份文档,收集量超过40亿份。我以前从未想过这种方法。但正如我所说,我每天必须处理1亿份插入。作为这种索引集合体系结构,如果每个文档都是唯一F1的最新文档,我必须对其进行更新。但是更新性能不足以满足1亿美元的日常收入,或者如果有其他方法来构建我错过的索引集合?如果有好的方法,请指导我。对不起,我不明白你的评论。如果您有足够的RAM来保存工作集并跟上写入速度,我认为我的建议是合理的。无论你想出什么,你都需要彻底测试。好的,谢谢!我会试试你的建议。或者我没有明确指出我的处境有什么困难。因为我每天插入不同的F1文档,金额为1亿,下一个TS F1将在下个月插入db。因此,我必须使用F1获取最新文档。但你的建议给了我另一个制作索引缓存的方向,我将在POC中尝试ti,再次尝试thx。