// Value::coerceToBool() is consistent with BSONElement::trueValue(). SERVER-6120 t = db.jstests_aggregation_server6120; t.drop(); t.save( {object: {a:1}} ); function coerceToBool( value ) { return t.aggregate( { $project:{ boolValue:{ $and:[ value ] } } } ).toArray()[ 0 ].boolValue; } function assertBoolValue( expectedBool, value ) { assert.eq( expectedBool, coerceToBool( value ) ); } // Bool type. assertBoolValue( false, false ); assertBoolValue( true, true ); // Numeric types. assertBoolValue( false, NumberLong( 0 ) ); assertBoolValue( true, NumberLong( 1 ) ); assertBoolValue( false, NumberInt( 0 ) ); assertBoolValue( true, NumberInt( 1 ) ); assertBoolValue( false, 0.0 ); assertBoolValue( true, 1.0 ); // Always false types. assertBoolValue( false, null ); // Always true types. assertBoolValue( true, '' ); assertBoolValue( true, 'a' ); assertBoolValue( true, "$object" ); assertBoolValue( true, [] ); assertBoolValue( true, [ 1 ] ); assertBoolValue( true, new ObjectId() ); assertBoolValue( true, new Date() ); assertBoolValue( true, /a/ ); assertBoolValue( true, new Timestamp() ); // Missing field. assertBoolValue( false, '$missingField' );