summaryrefslogtreecommitdiff
path: root/jstests/sharding/merge_to_existing.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/sharding/merge_to_existing.js')
-rw-r--r--jstests/sharding/merge_to_existing.js248
1 files changed, 124 insertions, 124 deletions
diff --git a/jstests/sharding/merge_to_existing.js b/jstests/sharding/merge_to_existing.js
index ff653186fcb..3e9038f9cc4 100644
--- a/jstests/sharding/merge_to_existing.js
+++ b/jstests/sharding/merge_to_existing.js
@@ -1,150 +1,150 @@
// Tests for $merge with an existing target collection.
(function() {
- "use strict";
+"use strict";
- load("jstests/aggregation/extras/merge_helpers.js"); // For withEachMergeMode.
- load("jstests/aggregation/extras/utils.js"); // For assertErrorCode.
+load("jstests/aggregation/extras/merge_helpers.js"); // For withEachMergeMode.
+load("jstests/aggregation/extras/utils.js"); // For assertErrorCode.
- const st = new ShardingTest({shards: 2, rs: {nodes: 1}, config: 1});
+const st = new ShardingTest({shards: 2, rs: {nodes: 1}, config: 1});
- const mongosDB = st.s0.getDB("source_db");
- const sourceColl = mongosDB["source_coll"];
- const outputCollSameDb = mongosDB[jsTestName() + "_merge"];
+const mongosDB = st.s0.getDB("source_db");
+const sourceColl = mongosDB["source_coll"];
+const outputCollSameDb = mongosDB[jsTestName() + "_merge"];
- function testMerge(sourceColl, targetColl, shardedSource, shardedTarget) {
- jsTestLog(`Testing $merge from ${sourceColl.getFullName()} ` +
- `(${shardedSource ? "sharded" : "unsharded"}) to ${targetColl.getFullName()} ` +
- `(${shardedTarget ? "sharded" : "unsharded"})`);
- sourceColl.drop();
- targetColl.drop();
- assert.commandWorked(targetColl.runCommand("create"));
+function testMerge(sourceColl, targetColl, shardedSource, shardedTarget) {
+ jsTestLog(`Testing $merge from ${sourceColl.getFullName()} ` +
+ `(${shardedSource ? "sharded" : "unsharded"}) to ${targetColl.getFullName()} ` +
+ `(${shardedTarget ? "sharded" : "unsharded"})`);
+ sourceColl.drop();
+ targetColl.drop();
+ assert.commandWorked(targetColl.runCommand("create"));
- if (shardedSource) {
- st.shardColl(sourceColl, {_id: 1}, {_id: 0}, {_id: 1}, sourceColl.getDB().getName());
+ if (shardedSource) {
+ st.shardColl(sourceColl, {_id: 1}, {_id: 0}, {_id: 1}, sourceColl.getDB().getName());
+ }
+
+ if (shardedTarget) {
+ st.shardColl(targetColl, {_id: 1}, {_id: 0}, {_id: 1}, targetColl.getDB().getName());
+ }
+
+ for (let i = -5; i < 5; i++) {
+ assert.commandWorked(sourceColl.insert({_id: i}));
+ }
+ withEachMergeMode(({whenMatchedMode, whenNotMatchedMode}) => {
+ // Test without documents in target collection.
+ assert.commandWorked(targetColl.remove({}));
+ if (whenNotMatchedMode == "fail") {
+ // Test whenNotMatchedMode: "fail" to an existing collection.
+ assertErrorCode(sourceColl,
+ [{
+ $merge: {
+ into: {
+ db: targetColl.getDB().getName(),
+ coll: targetColl.getName(),
+ },
+ whenMatched: whenMatchedMode,
+ whenNotMatched: whenNotMatchedMode
+ }
+ }],
+ 13113);
+ } else {
+ assert.doesNotThrow(() => sourceColl.aggregate([{
+ $merge: {
+ into: {
+ db: targetColl.getDB().getName(),
+ coll: targetColl.getName(),
+ },
+ whenMatched: whenMatchedMode,
+ whenNotMatched: whenNotMatchedMode
+ }
+ }]));
+ assert.eq(whenNotMatchedMode == "discard" ? 0 : 10, targetColl.find().itcount());
}
- if (shardedTarget) {
- st.shardColl(targetColl, {_id: 1}, {_id: 0}, {_id: 1}, targetColl.getDB().getName());
+ // Test with documents in target collection. Every document in the source collection is
+ // present in the target, plus some additional documents that doesn't match.
+ assert.commandWorked(targetColl.remove({}));
+ for (let i = -10; i < 5; i++) {
+ assert.commandWorked(targetColl.insert({_id: i}));
}
- for (let i = -5; i < 5; i++) {
- assert.commandWorked(sourceColl.insert({_id: i}));
+ if (whenMatchedMode == "fail") {
+ // Test whenMatched: "fail" to an existing collection with unique key conflicts.
+ assertErrorCode(sourceColl,
+ [{
+ $merge: {
+ into: {
+ db: targetColl.getDB().getName(),
+ coll: targetColl.getName(),
+ },
+ whenMatched: whenMatchedMode,
+ whenNotMatched: whenNotMatchedMode
+ }
+ }],
+ ErrorCodes.DuplicateKey);
+ } else {
+ assert.doesNotThrow(() => sourceColl.aggregate([{
+ $merge: {
+ into: {
+ db: targetColl.getDB().getName(),
+ coll: targetColl.getName(),
+ },
+ whenMatched: whenMatchedMode,
+ whenNotMatched: whenNotMatchedMode
+ }
+ }]));
}
- withEachMergeMode(({whenMatchedMode, whenNotMatchedMode}) => {
- // Test without documents in target collection.
- assert.commandWorked(targetColl.remove({}));
- if (whenNotMatchedMode == "fail") {
- // Test whenNotMatchedMode: "fail" to an existing collection.
- assertErrorCode(sourceColl,
- [{
- $merge: {
- into: {
- db: targetColl.getDB().getName(),
- coll: targetColl.getName(),
- },
- whenMatched: whenMatchedMode,
- whenNotMatched: whenNotMatchedMode
- }
- }],
- 13113);
- } else {
- assert.doesNotThrow(() => sourceColl.aggregate([{
- $merge: {
- into: {
- db: targetColl.getDB().getName(),
- coll: targetColl.getName(),
- },
- whenMatched: whenMatchedMode,
- whenNotMatched: whenNotMatchedMode
- }
- }]));
- assert.eq(whenNotMatchedMode == "discard" ? 0 : 10, targetColl.find().itcount());
- }
-
- // Test with documents in target collection. Every document in the source collection is
- // present in the target, plus some additional documents that doesn't match.
- assert.commandWorked(targetColl.remove({}));
- for (let i = -10; i < 5; i++) {
- assert.commandWorked(targetColl.insert({_id: i}));
- }
-
- if (whenMatchedMode == "fail") {
- // Test whenMatched: "fail" to an existing collection with unique key conflicts.
- assertErrorCode(sourceColl,
- [{
- $merge: {
- into: {
- db: targetColl.getDB().getName(),
- coll: targetColl.getName(),
- },
- whenMatched: whenMatchedMode,
- whenNotMatched: whenNotMatchedMode
- }
- }],
- ErrorCodes.DuplicateKey);
- } else {
- assert.doesNotThrow(() => sourceColl.aggregate([{
- $merge: {
- into: {
- db: targetColl.getDB().getName(),
- coll: targetColl.getName(),
- },
- whenMatched: whenMatchedMode,
- whenNotMatched: whenNotMatchedMode
- }
- }]));
- }
- assert.eq(15, targetColl.find().itcount());
- });
-
- // Legacy $out is only supported to the same database.
- if (sourceColl.getDB() === targetColl.getDB()) {
- if (shardedTarget) {
- // Test that legacy $out fails if the target collection is sharded.
- assertErrorCode(sourceColl, [{$out: targetColl.getName()}], 28769);
- } else {
- // Test that legacy $out will drop the target collection and replace with the
- // contents of the source collection.
- sourceColl.aggregate([{$out: targetColl.getName()}]);
- assert.eq(10, targetColl.find().itcount());
- }
+ assert.eq(15, targetColl.find().itcount());
+ });
+
+ // Legacy $out is only supported to the same database.
+ if (sourceColl.getDB() === targetColl.getDB()) {
+ if (shardedTarget) {
+ // Test that legacy $out fails if the target collection is sharded.
+ assertErrorCode(sourceColl, [{$out: targetColl.getName()}], 28769);
+ } else {
+ // Test that legacy $out will drop the target collection and replace with the
+ // contents of the source collection.
+ sourceColl.aggregate([{$out: targetColl.getName()}]);
+ assert.eq(10, targetColl.find().itcount());
}
}
+}
- //
- // Tests for $merge where the output collection is in the same database as the source
- // collection.
- //
+//
+// Tests for $merge where the output collection is in the same database as the source
+// collection.
+//
- // Test with unsharded source and sharded target collection.
- testMerge(sourceColl, outputCollSameDb, false, true);
+// Test with unsharded source and sharded target collection.
+testMerge(sourceColl, outputCollSameDb, false, true);
- // Test with sharded source and sharded target collection.
- testMerge(sourceColl, outputCollSameDb, true, true);
+// Test with sharded source and sharded target collection.
+testMerge(sourceColl, outputCollSameDb, true, true);
- // Test with sharded source and unsharded target collection.
- testMerge(sourceColl, outputCollSameDb, true, false);
+// Test with sharded source and unsharded target collection.
+testMerge(sourceColl, outputCollSameDb, true, false);
- // Test with unsharded source and unsharded target collection.
- testMerge(sourceColl, outputCollSameDb, false, false);
+// Test with unsharded source and unsharded target collection.
+testMerge(sourceColl, outputCollSameDb, false, false);
- //
- // Tests for $merge to a database that differs from the source collection's database.
- //
- const foreignDb = st.s0.getDB("foreign_db");
- const outputCollDiffDb = foreignDb["output_coll"];
+//
+// Tests for $merge to a database that differs from the source collection's database.
+//
+const foreignDb = st.s0.getDB("foreign_db");
+const outputCollDiffDb = foreignDb["output_coll"];
- // Test with sharded source and sharded target collection.
- testMerge(sourceColl, outputCollDiffDb, true, true);
+// Test with sharded source and sharded target collection.
+testMerge(sourceColl, outputCollDiffDb, true, true);
- // Test with unsharded source and unsharded target collection.
- testMerge(sourceColl, outputCollDiffDb, false, false);
+// Test with unsharded source and unsharded target collection.
+testMerge(sourceColl, outputCollDiffDb, false, false);
- // Test with unsharded source and sharded target collection.
- testMerge(sourceColl, outputCollDiffDb, false, true);
+// Test with unsharded source and sharded target collection.
+testMerge(sourceColl, outputCollDiffDb, false, true);
- // Test with sharded source and unsharded target collection.
- testMerge(sourceColl, outputCollDiffDb, true, false);
+// Test with sharded source and unsharded target collection.
+testMerge(sourceColl, outputCollDiffDb, true, false);
- st.stop();
+st.stop();
}());