// @tags: [ // # mapReduce does not support afterClusterTime. // does_not_support_causal_consistency, // does_not_support_stepdowns, // ] // 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);