diff --git a/lib/mongo/collection.rb b/lib/mongo/collection.rb index d014ad4..c65fcee 100644 --- a/lib/mongo/collection.rb +++ b/lib/mongo/collection.rb @@ -628,7 +628,12 @@ module Mongo if raw result elsif result["result"] - @db[result["result"]] + if result['result'].is_a? BSON::OrderedHash and result['result'].has_key? 'db' and result['result'].has_key? 'collection' + otherdb = @db.connection[result['result']['db']] + otherdb[result['result']['collection']] + else + @db[result["result"]] + end else raise ArgumentError, "Could not instantiate collection from result. If you specified " + "{:out => {:inline => true}}, then you must also specify :raw => true to get the results." diff --git a/test/collection_test.rb b/test/collection_test.rb index 9b04456..ed90ca7 100644 --- a/test/collection_test.rb +++ b/test/collection_test.rb @@ -559,6 +559,19 @@ class TestCollection < Test::Unit::TestCase @@test.map_reduce(m, r, :raw => true, :out => {:inline => 1}) assert res["results"] end + + def test_map_reduce_with_collection_output_to_other_db + @@test << {:user_id => 1} + @@test << {:user_id => 2} + + m = Code.new("function() { emit(this.user_id, 1); }") + r = Code.new("function(k,vals) { return 1; }") + res = @@test.map_reduce(m, r, :out => {:replace => 'foo', :db => 'somedb'}) + assert res["result"] + assert res["counts"] + assert res["timeMillis"] + assert res.find.to_a.any? {|doc| doc["_id"] == 2 && doc["value"] == 1} + end end end