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 connull
devolverá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 > null
se traduciría a(5-5) > 0 --> False
porque el tipo canónico de nulo es 5.
Del mismo modo,null < null
se 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.