Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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
Ruby on rails Ruby map/collect在大型Mongoid集合中速度较慢_Ruby On Rails_Ruby_Mongodb_Mongoid - Fatal编程技术网

Ruby on rails Ruby map/collect在大型Mongoid集合中速度较慢

Ruby on rails Ruby map/collect在大型Mongoid集合中速度较慢,ruby-on-rails,ruby,mongodb,mongoid,Ruby On Rails,Ruby,Mongodb,Mongoid,我有一个Mongoid集合,在该集合上运行where查询 现在,我想构建一个数组,其中包含集合中所有文档的特定字段的值 e、 g.如果我的Monogid模型是 class Foo field :color, type: String end 我想做这样的事情- red_ducks = Foo.where(color: 'red') red_duck_ids = red_ducks.map(&:_id) 不幸的是,当查询结果很大时,需要很长时间。例如,在我的例子中,10000个

我有一个Mongoid集合,在该集合上运行
where
查询

现在,我想构建一个数组,其中包含集合中所有文档的特定字段的值

e、 g.如果我的Monogid模型是

class Foo
    field :color, type: String
end
我想做这样的事情-

red_ducks = Foo.where(color: 'red')
red_duck_ids = red_ducks.map(&:_id)
不幸的是,当查询结果很大时,需要很长时间。例如,在我的例子中,10000个文档需要6秒钟


有没有办法加快速度

难道你不能用_id作为属性在你的作用域上调用distinct吗

red_duck_ids = Foo.where(color: 'red').distinct(:_id)
它将返回符合您条件的所有
\u id
的列表。您可以找到有关的更多信息

您还可以查看,如果您使用的是3.1版或更高版本,也可以使用

你试过了吗

Foo.where(color: 'red').pluck(:id)

可能会更快(不确定)

您真的需要同时使用10k ID吗?不幸的是,我需要。我在后续查询中使用它,比如
red\u duck\u owners=Bar.where(:foo\u ids.in=>red\u duck\u ids)
我想找到更好的方法,取出10k个ID然后再将其发送回不会很快。@muistooshort实际上只返回指定字段的值,因此它完全符合您的目的:它将返回符合您的条件的所有ID的列表,而无需首先将每个条目作为对象加载到内存中。很高兴我能帮忙!它之所以快得多,是因为它发生在DBMS级别。您要求Mongo查找ID并将其返回给您。
.map(&:_id)
正在获取所有记录并将它们加载到内存中(作为Ruby对象),要求每个对象提供其
\u id
@rkon:谢谢,我不知道它足够聪明,可以将distinct right发送到MongoDB。它实际上更快<代码>弹拨对于10k ID需要0.3-0.5秒。我想解释一下为什么它比
map
快10倍,我知道map会评估集合中的每个记录,所以map会运行10k+查询。。。但我真的不知道Pulk是如何工作的,也许这取决于mongodb中的某些东西是否能够运行一次特殊的查询