// 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'}));