mirror of https://github.com/mongodb/mongo
105 lines
3.1 KiB
JavaScript
105 lines
3.1 KiB
JavaScript
// Tests the 'merge' output mode for mapReduce.
|
|
// Cannot implicitly shard accessed collections because of following errmsg: Cannot output to a
|
|
// non-sharded collection because sharded collection exists already.
|
|
// @tags: [
|
|
// assumes_unsharded_collection,
|
|
// # mapReduce does not support afterClusterTime.
|
|
// does_not_support_causal_consistency,
|
|
// does_not_support_stepdowns,
|
|
// uses_map_reduce_with_temp_collections,
|
|
// ]
|
|
(function() {
|
|
"use strict";
|
|
(function() {
|
|
const source = db.mr_merge;
|
|
source.drop();
|
|
|
|
assert.commandWorked(source.insert({_id: 1, a: [1, 2]}));
|
|
assert.commandWorked(source.insert({_id: 2, a: [2, 3]}));
|
|
assert.commandWorked(source.insert({_id: 3, a: [3, 4]}));
|
|
|
|
const out = db.mr_merge_out;
|
|
const outName = out.getName();
|
|
out.drop();
|
|
|
|
const map = function() {
|
|
for (let i = 0; i < this.a.length; i++)
|
|
emit(this.a[i], 1);
|
|
};
|
|
const reduce = function(k, vs) {
|
|
return Array.sum(vs);
|
|
};
|
|
|
|
assert.commandWorked(source.mapReduce(map, reduce, {out: outName}));
|
|
|
|
let expected = [{_id: 1, value: 1}, {_id: 2, value: 2}, {_id: 3, value: 2}, {_id: 4, value: 1}];
|
|
assert.docEq(expected, out.find().sort({_id: 1}).toArray());
|
|
|
|
assert.commandWorked(source.insert({_id: 4, a: [4, 5]}));
|
|
// Insert something that should be unaltered by the mapReduce into the output collection.
|
|
assert.commandWorked(out.insert({_id: 10, value: 5}));
|
|
assert.commandWorked(
|
|
source.mapReduce(map, reduce, {out: {merge: outName}, query: {_id: {$gt: 3}}}));
|
|
|
|
expected = [
|
|
{_id: 1, value: 1},
|
|
{_id: 2, value: 2},
|
|
{_id: 3, value: 2},
|
|
{_id: 4, value: 1},
|
|
{_id: 5, value: 1},
|
|
{_id: 10, value: 5}
|
|
];
|
|
assert.docEq(expected, out.find().sort({_id: 1}).toArray());
|
|
|
|
assert.commandWorked(source.insert({_id: 5, a: [5, 6]}));
|
|
// Insert something that should be unaltered by the mapReduce into the output collection.
|
|
assert.commandWorked(out.insert({_id: 20, value: 10}));
|
|
assert.commandWorked(
|
|
source.mapReduce(map, reduce, {out: {merge: outName}, query: {_id: {$gt: 4}}}));
|
|
|
|
expected = [
|
|
{_id: 1, value: 1},
|
|
{_id: 2, value: 2},
|
|
{_id: 3, value: 2},
|
|
{_id: 4, value: 1},
|
|
{_id: 5, value: 1},
|
|
{_id: 6, value: 1},
|
|
{_id: 10, value: 5},
|
|
{_id: 20, value: 10}
|
|
];
|
|
assert.docEq(expected, out.find().sort({_id: 1}).toArray());
|
|
}());
|
|
(function() {
|
|
const source = db.mr_merge;
|
|
source.drop();
|
|
|
|
assert.commandWorked(source.insert({_id: 1, x: 1}));
|
|
assert.commandWorked(source.insert({_id: 2, x: 1}));
|
|
assert.commandWorked(source.insert({_id: 3, x: 2}));
|
|
|
|
const out = db.mr_merge_out;
|
|
const outName = out.getName();
|
|
out.drop();
|
|
|
|
const map = function() {
|
|
emit(this.x, 1);
|
|
};
|
|
const reduce = function(k, v) {
|
|
return Array.sum(v);
|
|
};
|
|
|
|
assert.commandWorked(
|
|
source.mapReduce(map, reduce, {out: {merge: outName}, query: {_id: {$gt: 0}}}));
|
|
|
|
assert.eq(2, out.findOne({_id: 1}).value);
|
|
assert.eq(1, out.findOne({_id: 2}).value);
|
|
|
|
assert.commandWorked(source.insert({_id: 4, x: 2}));
|
|
assert.commandWorked(
|
|
source.mapReduce(map, reduce, {out: {merge: outName}, query: {_id: {$gt: 3}}}));
|
|
|
|
assert.eq(2, out.findOne({_id: 1}).value);
|
|
assert.eq(1, out.findOne({_id: 2}).value);
|
|
}());
|
|
}());
|