You should not be able to construct a new instance of \MongoId with an invalid identifier. Currently, you are able to and it leads to inconsistencies as well as too many invalid queries.
new \MongoId('i am not a valid id!') -> '509403bd3689a3f942000000' (a valid mongo id)
Currently, before running all queries, we validate MongoId's, but I feel that this is a hack:
if ($id !== (new \MongoId($id)->__toString()) throw new InvalidMongoIdException();
Now we can track when users are passing in invalid ids and stop from unnecessary DB look-ups.
I propose that a null argument is what creates a new MongoId, and when given an argument, it wraps the given ID in a MongoId object, and when invalid, an exception is thrown.