// Test script from SERVER-1742 // MongoDB test script for mapreduce with geo query // setup test collection db.apples.drop() db.apples.insert( { "geo" : { "lat" : 32.68331909, "long" : 69.41610718 }, "apples" : 5 } ); db.apples.insert( { "geo" : { "lat" : 35.01860809, "long" : 70.92027283 }, "apples" : 2 } ); db.apples.insert( { "geo" : { "lat" : 31.11639023, "long" : 64.19970703 }, "apples" : 11 } ); db.apples.insert( { "geo" : { "lat" : 32.64500046, "long" : 69.36251068 }, "apples" : 4 } ); db.apples.insert( { "geo" : { "lat" : 33.23638916, "long" : 69.81360626 }, "apples" : 9 } ); db.apples.ensureIndex( { "geo" : "2d" } ); center = [ 32.68, 69.41 ]; radius = 10 / 111; // 10km; 1 arcdegree ~= 111km geo_query = { geo : { '$within' : { '$center' : [ center, radius ] } } }; // geo query on collection works fine res = db.apples.find( geo_query ); assert.eq( 2, res.count() ); // map function m = function() { emit( null, { "apples" : this.apples } ); }; // reduce function r = function(key, values) { var total = 0; for ( var i = 0; i < values.length; i++ ) { total += values[i].apples; } return { "apples" : total }; }; // mapreduce without geo query works fine res = db.apples.mapReduce( m, r, { out : { inline : 1 } } ); printjson( res ) total = res.results[0]; assert.eq( 31, total.value.apples ); // mapreduce with regular query works fine too res = db.apples.mapReduce( m, r, { out : { inline : 1 }, query : { apples : { '$lt' : 9 } } } ); total = res.results[0]; assert.eq( 11, total.value.apples ); // mapreduce with geo query gives error on mongodb version 1.6.2 // uncaught exception: map reduce failed: { // "assertion" : "manual matcher config not allowed", // "assertionCode" : 13285, // "errmsg" : "db assertion failure", // "ok" : 0 } res = db.apples.mapReduce( m, r, { out : { inline : 1 }, query : geo_query } ); total = res.results[0]; assert.eq( 9, total.value.apples );