// Check that $nin is the opposite of $in SERVER-3264 t = db.jstests_nin2; t.drop(); // Check various operator types. function checkOperators( array, inMatches ) { inCount = inMatches ? 1 : 0; notInCount = 1 - inCount; assert.eq( inCount, t.count( {foo:{$in:array}} ) ); assert.eq( notInCount, t.count( {foo:{$not:{$in:array}}} ) ); assert.eq( notInCount, t.count( {foo:{$nin:array}} ) ); assert.eq( inCount, t.count( {foo:{$not:{$nin:array}}} ) ); } t.save({}); assert.eq( 1, t.count( {foo:null} ) ); assert.eq( 0, t.count( {foo:{$ne:null}} ) ); assert.eq( 0, t.count( {foo:1} ) ); // Check matching null against missing field. checkOperators( [null], true ); checkOperators( [null,1], true ); checkOperators( [1,null], true ); t.remove({}); t.save({foo:null}); assert.eq( 1, t.count( {foo:null} ) ); assert.eq( 0, t.count( {foo:{$ne:null}} ) ); assert.eq( 0, t.count( {foo:1} ) ); // Check matching empty set. checkOperators( [], false ); // Check matching null against missing null field. checkOperators( [null], true ); checkOperators( [null,1], true ); checkOperators( [1,null], true ); t.remove({}); t.save({foo:1}); assert.eq( 0, t.count( {foo:null} ) ); assert.eq( 1, t.count( {foo:{$ne:null}} ) ); assert.eq( 1, t.count( {foo:1} ) ); // Check matching null against 1. checkOperators( [null], false ); checkOperators( [null,1], true ); checkOperators( [1,null], true ); t.remove({}); t.save( {foo:[0,1]} ); // Check exact match of embedded array. checkOperators( [[0,1]], true ); t.remove({}); t.save( {foo:[]} ); // Check exact match of embedded empty array. checkOperators( [[]], true ); t.remove({}); t.save( {foo:'foo'} ); // Check regex match. checkOperators( [/o/], true );