Mongoid map在输出集合中减少以模拟连接

时间:2015-03-12 17:24:23

标签: ruby-on-rails mongodb mapreduce mongoid

我正在使用mongodb / mongoid,我使用相同的键,值和返回格式在两个不同的集合中运行两个map / reduce进程。

(如本教程:http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/

我使用“out”选项模拟两个输出之间的合并来模拟连接操作......

我的“加入”集合已经很好地填充了,但只有当我迭代结果时才会出现!

如果我

  

Model_A.collection.map_reduce(map_1,reduce).out(reduce:“my_collection”)   Model_B.collection.map_reduce(map_2,reduce).out(reduce:“my_collection)

不起作用,集合“my_collection”为空!

如果我

  

res_A = Model_A.collection.map_reduce(map_1,reduce).out(reduce:“my_collection)

     

res_A.each do | res |     把res.inspect   端

     

res_B = Model_B.collection.map_reduce(map_1,reduce).out(reduce:“my_collection)

     

res_B.each do | res |     把res.inspect   端

这是有效的,我的收藏“my_collection”充满了“已加入”的值......

对于大数据集,在ruby中在Web应用程序服务器端进行迭代只是丑陋......

有没有人遇到过这个问题?

由于

1 个答案:

答案 0 :(得分:1)

对于第一个map-reduce,你可以调用#first,你的输出集合将填充所有值(实际上对于第二个map-reduce它也是如此,但你可能想要迭代它的结果任何情况)。

所以,而不是

res_A.each do| res | puts res.inspect end

只是做

res_A.first

您可以轻松检查mongo控制台中是否已填充该集合:

db.my_collection.find()

仅供参考

Model_A.collection.map_reduce(map_1, reduce).out(reduce: "my_collection)

实际上并没有在MongoDB中触发db.collection.mapReduce()函数。相反,它会返回Mongoid::Contextual::MapReduce类的实例,您可以将其视为与ActiveRecord::Relation类似的内容。