0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 09:32:32 +01:00
mongodb/jstests/geo_array2.js

164 lines
3.9 KiB
JavaScript

// Check the semantics of near calls with multiple locations
t = db.geoarray2
t.drop();
var numObjs = 10;
var numLocs = 100;
// Test the semantics of near / nearSphere / etc. queries with multiple keys per object
for( var i = -1; i < 2; i++ ){
for(var j = -1; j < 2; j++ ){
locObj = []
if( i != 0 || j != 0 )
locObj.push( { x : i * 50 + Random.rand(),
y : j * 50 + Random.rand() } )
locObj.push( { x : Random.rand(),
y : Random.rand() } )
locObj.push( { x : Random.rand(),
y : Random.rand() } )
t.insert({ name : "" + i + "" + j , loc : locObj , type : "A" })
t.insert({ name : "" + i + "" + j , loc : locObj , type : "B" })
}
}
t.ensureIndex({ loc : "2d" , type : 1 })
assert.isnull( db.getLastError() )
print( "Starting testing phase... ")
for( var t = 0; t < 2; t++ ){
var type = t == 0 ? "A" : "B"
for( var i = -1; i < 2; i++ ){
for(var j = -1; j < 2; j++ ){
var center = [ i * 50 , j * 50 ]
var count = i == 0 && j == 0 ? 2 * 9 : 1
var objCount = i == 0 && j == 0 ? 2 : 1
// Do near check
var nearResults = db.runCommand( { geoNear : "geoarray2" ,
near : center ,
num : count,
query : { type : type } } ).results
//printjson( nearResults )
var objsFound = {}
var lastResult = 0;
for( var k = 0; k < nearResults.length; k++ ){
// All distances should be small, for the # of results
assert.gt( 1.5 , nearResults[k].dis )
// Distances should be increasing
assert.lte( lastResult, nearResults[k].dis )
// Objs should be of the right type
assert.eq( type, nearResults[k].obj.type )
lastResult = nearResults[k].dis
var objKey = "" + nearResults[k].obj._id
if( objKey in objsFound ) objsFound[ objKey ]++
else objsFound[ objKey ] = 1
}
// Make sure we found the right objects each time
// Note: Multiple objects could be found for diff distances.
for( var q in objsFound ){
assert.eq( objCount , objsFound[q] )
}
// Do nearSphere check
// Earth Radius
var eRad = 6371
nearResults = db.geoarray2.find( { loc : { $nearSphere : center , $maxDistance : 500 /* km */ / eRad }, type : type } ).toArray()
assert.eq( nearResults.length , count )
objsFound = {}
lastResult = 0;
for( var k = 0; k < nearResults.length; k++ ){
var objKey = "" + nearResults[k]._id
if( objKey in objsFound ) objsFound[ objKey ]++
else objsFound[ objKey ] = 1
}
// Make sure we found the right objects each time
for( var q in objsFound ){
assert.eq( objCount , objsFound[q] )
}
// Within results do not return duplicate documents
var count = i == 0 && j == 0 ? 9 : 1
var objCount = i == 0 && j == 0 ? 1 : 1
// Do within check
objsFound = {}
var box = [ [center[0] - 1, center[1] - 1] , [center[0] + 1, center[1] + 1] ]
//printjson( box )
var withinResults = db.geoarray2.find({ loc : { $within : { $box : box } } , type : type }).toArray()
assert.eq( withinResults.length , count )
for( var k = 0; k < withinResults.length; k++ ){
var objKey = "" + withinResults[k]._id
if( objKey in objsFound ) objsFound[ objKey ]++
else objsFound[ objKey ] = 1
}
//printjson( objsFound )
// Make sure we found the right objects each time
for( var q in objsFound ){
assert.eq( objCount , objsFound[q] )
}
// Do within check (circle)
objsFound = {}
withinResults = db.geoarray2.find({ loc : { $within : { $center : [ center, 1.5 ] } } , type : type }).toArray()
assert.eq( withinResults.length , count )
for( var k = 0; k < withinResults.length; k++ ){
var objKey = "" + withinResults[k]._id
if( objKey in objsFound ) objsFound[ objKey ]++
else objsFound[ objKey ] = 1
}
// Make sure we found the right objects each time
for( var q in objsFound ){
assert.eq( objCount , objsFound[q] )
}
}
}
}