93 lines
3.6 KiB
JavaScript
93 lines
3.6 KiB
JavaScript
// 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]}}}));
|