Instead of failing, $type parsing converts a non-integral type code to -1, which is the type code for MinKey:
> db.c.drop() true > db.c.insert({a: 1}) WriteResult({ "nInserted" : 1 }) > db.c.insert({a: MinKey()}) WriteResult({ "nInserted" : 1 }) > db.c.insert({a: "foo"}) WriteResult({ "nInserted" : 1 }) > db.c.insert({a: MaxKey()}) WriteResult({ "nInserted" : 1 }) > db.c.find({a: {$type: -1}}) { "_id" : ObjectId("596925106d078d9cebb74764"), "a" : { "$minKey" : 1 } } > db.c.find({a: {$type: 1.5}}) { "_id" : ObjectId("596925106d078d9cebb74764"), "a" : { "$minKey" : 1 } } > db.c.find({a: {$type: 2.1}}) { "_id" : ObjectId("596925106d078d9cebb74764"), "a" : { "$minKey" : 1 } }
This behavior is due to the parser implementation here:
- causes
-
SERVER-31623 MatcherTypeSet::parseSingleType() should not cast large doubles to integer
- Closed