@@ -404,6 +404,7 @@ var deserializeObject = function(buffer, index, options, isArray) {
404
404
( buffer [ index ++ ] << 8 ) |
405
405
( buffer [ index ++ ] << 16 ) |
406
406
( buffer [ index ++ ] << 24 ) ;
407
+
407
408
object [ name ] = new Timestamp ( lowBits , highBits ) ;
408
409
} else if ( elementType === BSON . BSON_DATA_MIN_KEY ) {
409
410
object [ name ] = new MinKey ( ) ;
@@ -570,10 +571,23 @@ var deserializeObject = function(buffer, index, options, isArray) {
570
571
throw new Error ( 'corrupt object bson' ) ;
571
572
}
572
573
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
+ }
577
591
578
592
return object ;
579
593
} ;
0 commit comments