我正在使用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.每个都做| 把重新检查 结束
res_B = Model_B.collection.map_reduce(map_1, reduce).out(reduce: "my_collection)
res_B.每个都做 | 把重新检查 结束
它正在工作,我的收藏"my_collection"充满了"连接"值......
对于大型数据集,在 ruby 中的 Web 应用程序服务器端迭代是丑陋的......
有人遇到过这个问题吗?
谢谢
对于第一个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
的实例。