Files
mongo/jstests/core/query/update/update_arraymatch8.js
Mihai Andrei 5ed8f7dcf5 SERVER-93427 Move query writing tests from jstests/core/write to jstests/core/query (#31702)
GitOrigin-RevId: 2d69ca12e591fda58c4a5387ffae9d97c0ef2283
2025-02-04 19:38:51 +00:00

161 lines
6.0 KiB
JavaScript

// Checking for positional array updates with either .$ or .0 at the end
// SERVER-7511
// array.$.name
let t = db[jsTestName()];
t.drop();
assert.commandWorked(t.createIndex({'array.name': 1}));
assert.commandWorked(t.insert({'array': [{'name': 'old'}]}));
assert(t.findOne({'array.name': 'old'}));
assert.commandWorked(t.update({'array.name': 'old'}, {$set: {'array.$.name': 'new'}}));
assert(t.findOne({'array.name': 'new'}));
assert(!t.findOne({'array.name': 'old'}));
// array.$ (failed in 2.2.2)
t = db[jsTestName()];
assert(t.drop());
assert.commandWorked(t.createIndex({'array.name': 1}));
assert.commandWorked(t.insert({'array': [{'name': 'old'}]}));
assert(t.findOne({'array.name': 'old'}));
assert.commandWorked(t.update({'array.name': 'old'}, {$set: {'array.$': {'name': 'new'}}}));
assert(t.findOne({'array.name': 'new'}));
assert(!t.findOne({'array.name': 'old'}));
// array.0.name
t = db[jsTestName()];
assert(t.drop());
assert.commandWorked(t.createIndex({'array.name': 1}));
assert.commandWorked(t.insert({'array': [{'name': 'old'}]}));
assert(t.findOne({'array.name': 'old'}));
assert.commandWorked(t.update({'array.name': 'old'}, {$set: {'array.0.name': 'new'}}));
assert(t.findOne({'array.name': 'new'}));
assert(!t.findOne({'array.name': 'old'}));
// array.0 (failed in 2.2.2)
t = db[jsTestName()];
assert(t.drop());
assert.commandWorked(t.createIndex({'array.name': 1}));
assert.commandWorked(t.insert({'array': [{'name': 'old'}]}));
assert(t.findOne({'array.name': 'old'}));
assert.commandWorked(t.update({'array.name': 'old'}, {$set: {'array.0': {'name': 'new'}}}));
assert(t.findOne({'array.name': 'new'}));
assert(!t.findOne({'array.name': 'old'}));
// // array.12.name
t = db[jsTestName()];
assert(t.drop());
let arr = new Array();
for (var i = 0; i < 20; i++) {
arr.push({'name': 'old'});
}
assert.commandWorked(t.createIndex({'array.name': 1}));
assert.commandWorked(t.insert({_id: 0, 'array': arr}));
assert(t.findOne({'array.name': 'old'}));
assert.commandWorked(t.update({_id: 0}, {$set: {'array.12.name': 'new'}}));
// note: both documents now have to be in the array
assert(t.findOne({'array.name': 'new'}));
assert(t.findOne({'array.name': 'old'}));
// array.12 (failed in 2.2.2)
t = db[jsTestName()];
assert(t.drop());
arr = new Array();
for (var i = 0; i < 20; i++) {
arr.push({'name': 'old'});
}
assert.commandWorked(t.createIndex({'array.name': 1}));
assert.commandWorked(t.insert({_id: 0, 'array': arr}));
assert(t.findOne({'array.name': 'old'}));
assert.commandWorked(t.update({_id: 0}, {$set: {'array.12': {'name': 'new'}}}));
// note: both documents now have to be in the array
assert(t.findOne({'array.name': 'new'}));
assert(t.findOne({'array.name': 'old'}));
// array.$.123a.name
t = db.jstests_update_arraymatch8;
assert(t.drop());
assert.commandWorked(t.createIndex({'array.123a.name': 1}));
assert.commandWorked(t.insert({'array': [{'123a': {'name': 'old'}}]}));
assert(t.findOne({'array.123a.name': 'old'}));
assert.commandWorked(t.update({'array.123a.name': 'old'}, {$set: {'array.$.123a.name': 'new'}}));
assert(t.findOne({'array.123a.name': 'new'}));
assert(!t.findOne({'array.123a.name': 'old'}));
// array.$.123a
t = db.jstests_update_arraymatch8;
assert(t.drop());
assert.commandWorked(t.createIndex({'array.name': 1}));
assert.commandWorked(t.insert({'array': [{'123a': {'name': 'old'}}]}));
assert(t.findOne({'array.123a.name': 'old'}));
assert.commandWorked(
t.update({'array.123a.name': 'old'}, {$set: {'array.$.123a': {'name': 'new'}}}));
assert(t.findOne({'array.123a.name': 'new'}));
assert(!t.findOne({'array.123a.name': 'old'}));
// array.0.123a.name
t = db.jstests_update_arraymatch8;
assert(t.drop());
assert.commandWorked(t.createIndex({'array.123a.name': 1}));
assert.commandWorked(t.insert({'array': [{'123a': {'name': 'old'}}]}));
assert(t.findOne({'array.123a.name': 'old'}));
assert.commandWorked(t.update({'array.123a.name': 'old'}, {$set: {'array.0.123a.name': 'new'}}));
assert(t.findOne({'array.123a.name': 'new'}));
assert(!t.findOne({'array.123a.name': 'old'}));
// array.0.123a
t = db.jstests_update_arraymatch8;
assert(t.drop());
assert.commandWorked(t.createIndex({'array.name': 1}));
assert.commandWorked(t.insert({'array': [{'123a': {'name': 'old'}}]}));
assert(t.findOne({'array.123a.name': 'old'}));
assert.commandWorked(
t.update({'array.123a.name': 'old'}, {$set: {'array.0.123a': {'name': 'new'}}}));
assert(t.findOne({'array.123a.name': 'new'}));
assert(!t.findOne({'array.123a.name': 'old'}));
// a.0.b
t = db.jstests_update_arraymatch8;
assert(t.drop());
assert.commandWorked(t.createIndex({'a.0.b': 1}));
assert.commandWorked(t.insert({'a': [[{b: 'old'}]]}));
assert(t.findOne({'a.0.0.b': 'old'}));
assert(t.findOne({'a.0.b': 'old'}));
assert.commandWorked(t.update({}, {$set: {'a.0.0.b': 'new'}}));
assert(t.findOne({'a.0.b': 'new'}));
assert(!t.findOne({'a.0.b': 'old'}));
// a.0.b.c
t = db.jstests_update_arraymatch8;
assert(t.drop());
assert.commandWorked(t.createIndex({'a.0.b.c': 1}));
assert.commandWorked(t.insert({'a': [{b: [{c: 'old'}]}]}));
assert(t.findOne({'a.0.b.0.c': 'old'}));
assert(t.findOne({'a.b.0.c': 'old'}));
assert(t.findOne({'a.0.b.c': 'old'}));
assert(t.findOne({'a.b.c': 'old'}));
assert.commandWorked(t.update({}, {$set: {'a.0.b.0.c': 'new'}}));
assert(t.findOne({'a.0.b.c': 'new'}));
assert(!t.findOne({'a.0.b.c': 'old'}));
// a.b.$ref
t = db.jstests_update_arraymatch8;
assert(t.drop());
assert.commandWorked(t.createIndex({'a.b.$ref': 1}));
assert.commandWorked(t.insert({'a': [{'b': {'$ref': 'old', '$id': 0}}]}));
assert(t.findOne({'a.b.$ref': 'old'}));
assert(t.findOne({'a.0.b.$ref': 'old'}));
assert.commandWorked(t.update({}, {$set: {'a.0.b.$ref': 'new'}}));
assert(t.findOne({'a.b.$ref': 'new'}));
assert(!t.findOne({'a.b.$ref': 'old'}));
// a.b and a-b
t = db[jsTestName()];
assert(t.drop());
assert.commandWorked(t.createIndex({'a.b': 1}));
assert.commandWorked(t.createIndex({'a-b': 1}));
assert.commandWorked(t.insert({'a': {'b': 'old'}}));
assert(t.findOne({'a.b': 'old'}));
assert.commandWorked(t.update({}, {$set: {'a': {'b': 'new'}}}));
assert(t.findOne({'a.b': 'new'}));
assert(!t.findOne({'a.b': 'old'}));