输出集合中的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.每个都做| 把重新检查 结束

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 的实例。

最新更新