@@ -404,6 +404,7 @@ var deserializeObject = function(buffer, index, options, isArray) {
404404 ( buffer [ index ++ ] << 8 ) |
405405 ( buffer [ index ++ ] << 16 ) |
406406 ( buffer [ index ++ ] << 24 ) ;
407+
407408 object [ name ] = new Timestamp ( lowBits , highBits ) ;
408409 } else if ( elementType === BSON . BSON_DATA_MIN_KEY ) {
409410 object [ name ] = new MinKey ( ) ;
@@ -570,10 +571,23 @@ var deserializeObject = function(buffer, index, options, isArray) {
570571 throw new Error ( 'corrupt object bson' ) ;
571572 }
572573
573- // Check if we have a db ref object
574- // this breaks one of the spec tests. should only become a dbref if it's explicitly
575- // wrapped, like a {dbref: {$ref: ...}}
576- // if (object['$id'] != null) object = new DBRef(object['$ref'], object['$id'], object['$db']);
574+ // check if object's $ keys are those of a DBRef
575+ var dollarKeys = Object . keys ( object ) . filter ( k => k . startsWith ( '$' ) ) ;
576+ var valid = true ;
577+ dollarKeys . forEach ( k => {
578+ if ( [ '$ref' , '$id' , '$db' ] . indexOf ( k ) === - 1 ) valid = false ;
579+ } ) ;
580+
581+ // if a $key not in "$ref", "$id", "$db", don't make a DBRef
582+ if ( ! valid ) return object ;
583+
584+ if ( object [ '$id' ] != null && object [ '$ref' ] != null ) {
585+ let copy = Object . assign ( { } , object ) ;
586+ delete copy . $ref ;
587+ delete copy . $id ;
588+ delete copy . $db ;
589+ return new DBRef ( object . $ref , object . $id , object . $db || null , copy ) ;
590+ }
577591
578592 return object ;
579593} ;
0 commit comments