// Cannot implicitly shard accessed collections because of use of $near query instead of geoNear // command. // @tags: [assumes_unsharded_collection] // Additional checks for geo uniqueDocs and includeLocs SERVER-3139. // SERVER-12120 uniqueDocs is deprecated. // Server always returns results with implied uniqueDocs=true collName = 'jstests_geo_uniqueDocs2'; t = db[collName]; t.drop(); t.save({loc: [[20, 30], [40, 50]]}); t.ensureIndex({loc: '2d'}); // Check exact matches of different locations. assert.eq(1, t.count({loc: [20, 30]})); assert.eq(1, t.count({loc: [40, 50]})); // Check behavior for $near, where $uniqueDocs mode is unavailable. assert.eq([t.findOne()], t.find({loc: {$near: [50, 50]}}).toArray()); // Check correct number of matches for $within / $uniqueDocs. // uniqueDocs ignored - does not affect results. assert.eq(1, t.count({loc: {$within: {$center: [[30, 30], 40]}}})); assert.eq(1, t.count({loc: {$within: {$center: [[30, 30], 40], $uniqueDocs: true}}})); assert.eq(1, t.count({loc: {$within: {$center: [[30, 30], 40], $uniqueDocs: false}}})); // For $within / $uniqueDocs, limit applies to docs. assert.eq( 1, t.find({loc: {$within: {$center: [[30, 30], 40], $uniqueDocs: false}}}).limit(1).itcount()); // Now check a circle only containing one of the locs. assert.eq(1, t.count({loc: {$within: {$center: [[30, 30], 10]}}})); assert.eq(1, t.count({loc: {$within: {$center: [[30, 30], 10], $uniqueDocs: true}}})); assert.eq(1, t.count({loc: {$within: {$center: [[30, 30], 10], $uniqueDocs: false}}})); // Check number and character of results with geoNear / uniqueDocs / includeLocs. notUniqueNotInclude = db.runCommand( {geoNear: collName, near: [50, 50], num: 10, uniqueDocs: false, includeLocs: false}); uniqueNotInclude = db.runCommand( {geoNear: collName, near: [50, 50], num: 10, uniqueDocs: true, includeLocs: false}); notUniqueInclude = db.runCommand( {geoNear: collName, near: [50, 50], num: 10, uniqueDocs: false, includeLocs: true}); uniqueInclude = db.runCommand( {geoNear: collName, near: [50, 50], num: 10, uniqueDocs: true, includeLocs: true}); // Check that only unique docs are returned. assert.eq(1, notUniqueNotInclude.results.length); assert.eq(1, uniqueNotInclude.results.length); assert.eq(1, notUniqueInclude.results.length); assert.eq(1, uniqueInclude.results.length); // Check that locs are included. assert(!notUniqueNotInclude.results[0].loc); assert(!uniqueNotInclude.results[0].loc); assert(notUniqueInclude.results[0].loc); assert(uniqueInclude.results[0].loc); // For geoNear / uniqueDocs, 'num' limit seems to apply to locs. assert.eq(1, db.runCommand( {geoNear: collName, near: [50, 50], num: 1, uniqueDocs: false, includeLocs: false}) .results.length); // Check locs returned in includeLocs mode. t.remove({}); objLocs = [{x: 20, y: 30, z: ['loc1', 'loca']}, {x: 40, y: 50, z: ['loc2', 'locb']}]; t.save({loc: objLocs}); results = db.runCommand( {geoNear: collName, near: [50, 50], num: 10, uniqueDocs: false, includeLocs: true}) .results; assert.contains(results[0].loc, objLocs); // Check locs returned in includeLocs mode, where locs are arrays. t.remove({}); arrLocs = [[20, 30], [40, 50]]; t.save({loc: arrLocs}); results = db.runCommand( {geoNear: collName, near: [50, 50], num: 10, uniqueDocs: false, includeLocs: true}) .results; // The original loc arrays are returned as objects. expectedLocs = arrLocs; assert.contains(results[0].loc, expectedLocs); // Test a large number of locations in the array. t.drop(); arr = []; for (i = 0; i < 10000; ++i) { arr.push([10, 10]); } arr.push([100, 100]); t.save({loc: arr}); t.ensureIndex({loc: '2d'}); assert.eq(1, t.count({loc: {$within: {$center: [[99, 99], 5]}}}));