diff options
Diffstat (limited to 'jstests/core/geo_uniqueDocs2.js')
-rw-r--r-- | jstests/core/geo_uniqueDocs2.js | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/jstests/core/geo_uniqueDocs2.js b/jstests/core/geo_uniqueDocs2.js new file mode 100644 index 00000000000..f9b95113f78 --- /dev/null +++ b/jstests/core/geo_uniqueDocs2.js @@ -0,0 +1,80 @@ +// 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] } } } ) ); |