我正在使用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应用程序服务器端进行迭代只是丑陋......
有没有人遇到过这个问题?
由于
答案 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
类似的内容。