diff options
Diffstat (limited to 'jstests/noPassthrough/arrayFilters_feature_compatibility_version.js')
-rw-r--r-- | jstests/noPassthrough/arrayFilters_feature_compatibility_version.js | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/jstests/noPassthrough/arrayFilters_feature_compatibility_version.js b/jstests/noPassthrough/arrayFilters_feature_compatibility_version.js new file mode 100644 index 00000000000..6877bc12c30 --- /dev/null +++ b/jstests/noPassthrough/arrayFilters_feature_compatibility_version.js @@ -0,0 +1,78 @@ +// Test that arrayFilters usage is restricted when the featureCompatibilityVersion is 3.4. + +(function() { + "use strict"; + + const conn = MongoRunner.runMongod({}); + assert.neq(null, conn, "mongod was unable to start up"); + + let testDB = conn.getDB("arrayFilters_feature_compatibility_version"); + assert.commandWorked(testDB.dropDatabase()); + let coll = testDB.coll; + + let adminDB = conn.getDB("admin"); + + let res; + + // + // arrayFilters is not permitted when the featureCompatibilityVersion is 3.4. + // + + assert.commandWorked(adminDB.runCommand({setFeatureCompatibilityVersion: "3.4"})); + res = adminDB.runCommand({getParameter: 1, featureCompatibilityVersion: 1}); + assert.commandWorked(res); + assert.eq("3.4", res.featureCompatibilityVersion); + + // Update. + res = coll.update({_id: 0}, {$set: {"a.$[i]": 5}}, {arrayFilters: [{i: 0}]}); + assert.writeError(res, ErrorCodes.InvalidOptions); + assert.neq( + -1, + res.getWriteError().errmsg.indexOf( + "The featureCompatibilityVersion must be 3.6 to use arrayFilters. See http://dochub.mongodb.org/core/3.6-feature-compatibility."), + "update failed for a reason other than featureCompatibilityVersion"); + + // FindAndModify. + assert.throws(function() { + coll.findAndModify( + {query: {_id: 0}, update: {$set: {"a.$[i]": 5}}, arrayFilters: [{i: 0}]}); + }); + + // Update explain. + assert.throws(function() { + coll.explain().update({_id: 0}, {$set: {"a.$[i]": 5}}, {arrayFilters: [{i: 0}]}); + }); + + // FindAndModify explain. + assert.throws(function() { + coll.explain().findAndModify( + {query: {_id: 0}, update: {$set: {"a.$[i]": 5}}, arrayFilters: [{i: 0}]}); + }); + + // + // arrayFilters is permitted when the featureCompatibilityVersion is 3.6. + // + + assert.commandWorked(adminDB.runCommand({setFeatureCompatibilityVersion: "3.6"})); + res = adminDB.runCommand({getParameter: 1, featureCompatibilityVersion: 1}); + assert.commandWorked(res); + assert.eq("3.6", res.featureCompatibilityVersion); + + // Update. + assert.writeOK(coll.update({_id: 0}, {$set: {"a.$[i]": 5}}, {arrayFilters: [{i: 0}]})); + + // FindAndModify. + assert.eq(null, + coll.findAndModify( + {query: {_id: 0}, update: {$set: {"a.$[i]": 5}}, arrayFilters: [{i: 0}]})); + + // Update explain. + assert.commandWorked( + coll.explain().update({_id: 0}, {$set: {"a.$[i]": 5}}, {arrayFilters: [{i: 0}]})); + + // FindAndModify explain. + assert.commandWorked(coll.explain().findAndModify( + {query: {_id: 0}, update: {$set: {"a.$[i]": 5}}, arrayFilters: [{i: 0}]})); + + MongoRunner.stopMongod(conn); +}()); |