158 lines
5.3 KiB
JavaScript
158 lines
5.3 KiB
JavaScript
// Checking for positional array updates with either .$ or .0 at the end
|
|
// SERVER-7511
|
|
|
|
// array.$.name
|
|
t = db.jstests_update_arraymatch8;
|
|
t.drop();
|
|
t.ensureIndex( {'array.name': 1} );
|
|
t.insert( {'array': [{'name': 'old'}]} );
|
|
assert( t.findOne({'array.name': 'old'}) );
|
|
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.jstests_update_arraymatch8;
|
|
t.drop();
|
|
t.ensureIndex( {'array.name': 1} );
|
|
t.insert( {'array': [{'name': 'old'}]} );
|
|
assert( t.findOne({'array.name': 'old'}) );
|
|
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.jstests_update_arraymatch8;
|
|
t.drop();
|
|
t.ensureIndex( {'array.name': 1} );
|
|
t.insert( {'array': [{'name': 'old'}]} );
|
|
assert( t.findOne({'array.name': 'old'}) );
|
|
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.jstests_update_arraymatch8;
|
|
t.drop();
|
|
t.ensureIndex( {'array.name': 1} );
|
|
t.insert( {'array': [{'name': 'old'}]} );
|
|
assert( t.findOne({'array.name': 'old'}) );
|
|
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.jstests_update_arraymatch8;
|
|
t.drop();
|
|
arr = new Array();
|
|
for (var i=0; i<20; i++) {
|
|
arr.push({'name': 'old'});
|
|
}
|
|
t.ensureIndex( {'array.name': 1} );
|
|
t.insert( {_id:0, 'array': arr} );
|
|
assert( t.findOne({'array.name': 'old'}) );
|
|
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.jstests_update_arraymatch8;
|
|
t.drop();
|
|
arr = new Array();
|
|
for (var i=0; i<20; i++) {
|
|
arr.push({'name': 'old'});
|
|
}
|
|
t.ensureIndex( {'array.name': 1} );
|
|
t.insert( {_id:0, 'array': arr} );
|
|
assert( t.findOne({'array.name': 'old'}) );
|
|
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;
|
|
t.drop();
|
|
t.ensureIndex( {'array.123a.name': 1} );
|
|
t.insert( {'array': [{'123a':{'name': 'old'}}]} );
|
|
assert( t.findOne({'array.123a.name': 'old'}) );
|
|
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;
|
|
t.drop();
|
|
t.ensureIndex( {'array.name': 1} );
|
|
t.insert( {'array': [{'123a':{'name': 'old'}}]} );
|
|
assert( t.findOne({'array.123a.name': 'old'}) );
|
|
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;
|
|
t.drop();
|
|
t.ensureIndex( {'array.123a.name': 1} );
|
|
t.insert( {'array': [{'123a':{'name': 'old'}}]} );
|
|
assert( t.findOne({'array.123a.name': 'old'}) );
|
|
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;
|
|
t.drop();
|
|
t.ensureIndex( {'array.name': 1} );
|
|
t.insert( {'array': [{'123a':{'name': 'old'}}]} );
|
|
assert( t.findOne({'array.123a.name': 'old'}) );
|
|
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;
|
|
t.drop();
|
|
t.ensureIndex( {'a.0.b': 1} );
|
|
t.insert( {'a': [ [ { b:'old' } ] ] } );
|
|
assert( t.findOne({'a.0.0.b': 'old'}) );
|
|
assert( t.findOne({'a.0.b': 'old'}) );
|
|
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;
|
|
t.drop();
|
|
t.ensureIndex( {'a.0.b.c': 1} );
|
|
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'}) );
|
|
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;
|
|
t.drop();
|
|
t.ensureIndex( {'a.b.$ref': 1} );
|
|
t.insert( {'a': [ { 'b':{ '$ref':'old', '$id':0 } } ] } );
|
|
assert( t.findOne({'a.b.$ref': 'old'}) );
|
|
assert( t.findOne({'a.0.b.$ref': 'old'}) );
|
|
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.jstests_update_arraymatch8;
|
|
t.drop();
|
|
t.ensureIndex( {'a.b': 1} );
|
|
t.ensureIndex( {'a-b': 1} );
|
|
t.insert( {'a':{'b':'old'}} );
|
|
assert( t.findOne({'a.b': 'old'}) );
|
|
t.update( {}, {$set: {'a': {'b': 'new'}}} );
|
|
assert( t.findOne({'a.b': 'new'}) );
|
|
assert( !t.findOne({'a.b': 'old'}) );
|