143 lines
2.9 KiB
JavaScript
143 lines
2.9 KiB
JavaScript
t = db.group1;
|
|
t.drop();
|
|
|
|
t.save({n: 1, a: 1});
|
|
t.save({n: 2, a: 1});
|
|
t.save({n: 3, a: 2});
|
|
t.save({n: 4, a: 2});
|
|
t.save({n: 5, a: 2});
|
|
|
|
var p = {
|
|
key: {a: true},
|
|
reduce: function(obj, prev) {
|
|
prev.count++;
|
|
},
|
|
initial: {count: 0}
|
|
};
|
|
|
|
res = t.group(p);
|
|
|
|
assert(res.length == 2, "A");
|
|
assert(res[0].a == 1, "B");
|
|
assert(res[0].count == 2, "C");
|
|
assert(res[1].a == 2, "D");
|
|
assert(res[1].count == 3, "E");
|
|
|
|
assert.eq(res, t.groupcmd(p), "ZZ");
|
|
|
|
ret = t.groupcmd({key: {}, reduce: p.reduce, initial: p.initial});
|
|
assert.eq(1, ret.length, "ZZ 2");
|
|
assert.eq(5, ret[0].count, "ZZ 3");
|
|
|
|
ret = t.groupcmd({
|
|
key: {},
|
|
reduce: function(obj, prev) {
|
|
prev.sum += obj.n;
|
|
},
|
|
initial: {sum: 0}
|
|
});
|
|
assert.eq(1, ret.length, "ZZ 4");
|
|
assert.eq(15, ret[0].sum, "ZZ 5");
|
|
|
|
t.drop();
|
|
|
|
t.save({"a": 2});
|
|
t.save({"b": 5});
|
|
t.save({"a": 1});
|
|
t.save({"a": 2});
|
|
|
|
c = {
|
|
key: {a: 1},
|
|
cond: {},
|
|
initial: {"count": 0},
|
|
reduce: function(obj, prev) {
|
|
prev.count++;
|
|
}
|
|
};
|
|
|
|
assert.eq(t.group(c), t.groupcmd(c), "ZZZZ");
|
|
|
|
t.drop();
|
|
|
|
t.save({name: {first: "a", last: "A"}});
|
|
t.save({name: {first: "b", last: "B"}});
|
|
t.save({name: {first: "a", last: "A"}});
|
|
|
|
p = {
|
|
key: {'name.first': true},
|
|
reduce: function(obj, prev) {
|
|
prev.count++;
|
|
},
|
|
initial: {count: 0}
|
|
};
|
|
|
|
res = t.group(p);
|
|
assert.eq(2, res.length, "Z1");
|
|
assert.eq("a", res[0]['name.first'], "Z2");
|
|
assert.eq("b", res[1]['name.first'], "Z3");
|
|
assert.eq(2, res[0].count, "Z4");
|
|
assert.eq(1, res[1].count, "Z5");
|
|
|
|
// SERVER-15851 Test invalid user input.
|
|
p = {
|
|
ns: "group1",
|
|
key: {"name.first": true},
|
|
$reduce: function(obj, prev) {
|
|
prev.count++;
|
|
},
|
|
initial: {count: 0},
|
|
finalize: "abc"
|
|
};
|
|
assert.commandFailedWithCode(
|
|
db.runCommand({group: p}), ErrorCodes.JSInterpreterFailure, "Illegal finalize function");
|
|
|
|
p = {
|
|
ns: "group1",
|
|
key: {"name.first": true},
|
|
$reduce: function(obj, prev) {
|
|
prev.count++;
|
|
},
|
|
initial: {count: 0},
|
|
finalize: function(obj) {
|
|
ob;
|
|
}
|
|
};
|
|
assert.commandFailedWithCode(
|
|
db.runCommand({group: p}), ErrorCodes.JSInterpreterFailure, "Illegal finalize function 2");
|
|
|
|
p = {
|
|
ns: "group1",
|
|
$keyf: "a",
|
|
$reduce: function(obj, prev) {
|
|
prev.count++;
|
|
},
|
|
initial: {count: 0},
|
|
finalize: function(obj) {
|
|
ob;
|
|
}
|
|
};
|
|
assert.commandFailedWithCode(
|
|
db.runCommand({group: p}), ErrorCodes.JSInterpreterFailure, "Illegal keyf function");
|
|
|
|
p = {
|
|
ns: "group1",
|
|
key: {"name.first": true},
|
|
$reduce: "abc",
|
|
initial: {count: 0}
|
|
};
|
|
assert.commandFailedWithCode(
|
|
db.runCommand({group: p}), ErrorCodes.JSInterpreterFailure, "Illegal reduce function");
|
|
|
|
p = {
|
|
ns: "group1",
|
|
key: {"name.first": true},
|
|
$reduce: function(obj, pre) {
|
|
prev.count++;
|
|
},
|
|
initial: {count: 0}
|
|
};
|
|
assert.commandFailedWithCode(
|
|
db.runCommand({group: p}), ErrorCodes.JSInterpreterFailure, "Illegal reduce function 2");
|
|
|
|
t.drop();
|