Files
mongo/jstests/aggregation/bugs/server9444.js

57 lines
2.1 KiB
JavaScript

// server-9444 support disk storage of intermediate results in aggregation
var t = db.server9444;
t.drop();
var memoryLimitMB = 100;
function loadData() {
var bigStr = Array(1024*1024 + 1).toString(); // 1MB of ','
for (var i = 0; i < 101; i++)
t.insert({_id: i, bigStr: i + bigStr, random: Math.random()});
assert.gt(t.stats().size, memoryLimitMB * 1024*1024);
}
loadData();
function test(pipeline, outOfMemoryCode) {
// don't return bigStr so result size is under limit
pipeline.push({$project: {_id:1, random:1}});
// ensure by default we error out if exceeding memory limit
var res = t.runCommand('aggregate', {pipeline: pipeline});
assert.commandFailed(res);
assert.eq(res.code, outOfMemoryCode);
// ensure allowDiskUsage: false does what it says
var res = t.runCommand('aggregate', {pipeline: pipeline, allowDiskUsage: false});
assert.commandFailed(res);
assert.eq(res.code, outOfMemoryCode);
// allowDiskUsage only supports bool. In particular, numbers aren't allowed.
var res = t.runCommand('aggregate', {pipeline: pipeline, allowDiskUsage: 1});
assert.commandFailed(res);
assert.eq(res.code, 16949);
// ensure we work when allowingDiskUsage === true
var res = t.runCommand('aggregate', {pipeline: pipeline, allowDiskUsage: true});
assert.commandWorked(res);
}
var groupCode = 16945;
var sortCode = 16819;
test([{$group: {_id: '$_id', bigStr: {$first: '$bigStr'}}}], groupCode);
test([{$sort: {bigStr: 1}}], sortCode); // can't use index
// test combining two extSorts in both same and different orders
test([{$group: {_id: '$_id', bigStr: {$first: '$bigStr'}}}, {$sort: {_id:1}}], groupCode);
test([{$group: {_id: '$_id', bigStr: {$first: '$bigStr'}}}, {$sort: {_id:-1}}], groupCode);
test([{$group: {_id: '$_id', bigStr: {$first: '$bigStr'}}}, {$sort: {random:1}}], groupCode);
// sorting with _id would use index which doesn't require extsort
test([{$sort: {random:1}}, {$group: {_id: '$_id', bigStr: {$first: '$bigStr'}}}], sortCode);
// don't leave large collection laying around
t.drop();