Detalles esenciales
Leyendo la última fuente de Mongo , básicamente hay 2 casos al hacer comparaciones que involucran null :
- Si los tipos canónicos de los elementos BSON que se comparan son diferentes, solo comparaciones de igualdad (
==,>=,<=) de nulo e indefinido devolverátrue; de lo contrario, cualquier comparación connulldevolveráfalse.
Nota: Ningún otro tipo de BSON tiene el mismo tipo canónico quenull. - Si los tipos canónicos son iguales (es decir, ambos elementos son
null), luego compareElementValues se llama. Paranull, esto solo devuelve la diferencia entre el canónico escribir de ambos elementos BSON y luego realiza la comparación solicitada contra0.
Por ejemplo,null > nullse traduciría a(5-5) > 0 --> Falseporque el tipo canónico de nulo es 5.
Del mismo modo,null < nullse traduciría a(5-5) < 0 --> False.
Esto significa null solo puede ser igual a null o undefined . Cualquier otra comparación que involucre null siempre devolverá false .
¿Es esto un error?
Respuesta actualizada:
La documentación para los operadores de comparación ($gt
, $lt
) hace referencia a la documentación que vinculó originalmente , lo que implica que los operadores de comparación deberían trabajar con null . Además, la clasificación de consultas (es decir, , db.find().sort() ) hace siga con precisión el comportamiento documentado de Comparación/Ordenación.
Esto es, por lo menos, inconsistente. Creo que valdría la pena enviar un informe de error al sitio JIRA de MongoDB .
Respuesta original:
No creo que este comportamiento sea un error.
El consenso general para Javascript
es eso undefined significa sin asignar mientras que null significa asignado pero no definido . Las comparaciones de valores contra indefinidos, aparte de la igualdad, no tienen sentido, al menos en un sentido matemático.
Dado que BSON se basa en gran medida en JavaScript, esto también se aplica a MongoDB.