Dettagli nitidi
Leggere l'ultima fonte Mongo , ci sono fondamentalmente 2 casi quando si eseguono confronti che coinvolgono null
:
- Se i tipi canonici degli elementi BSON confrontati sono diversi, solo confronti di uguaglianza (
==
,>=
,<=
) di null &undefined restituiràtrue
; altrimenti qualsiasi confronto connull
restituiràfalse
.
Nota: Nessun altro tipo BSON ha lo stesso tipo canonico dinull
. - Se i tipi canonici sono gli stessi (cioè, entrambi gli elementi sono
null
), quindi compareElementValues è chiamato. Pernull
, questo restituisce solo la differenza tra il canonico digita di entrambi gli elementi BSON e quindi esegue il confronto richiesto con0
.
Ad esempio,null > null
si tradurrebbe in(5-5) > 0 --> False
perché il tipo canonico di null è 5.
Allo stesso modo,null < null
si tradurrebbe in(5-5) < 0 --> False
.
Ciò significa null
può essere sempre uguale a null
o undefined
. Qualsiasi altro confronto che coinvolga null
restituirà sempre false
.
È un bug?
Risposta aggiornata:
La documentazione per gli operatori di confronto ($gt
, $lt
) fa riferimento a la documentazione che hai originariamente collegato , il che implica che gli operatori di confronto dovrebbero lavora con null
. Inoltre, l'ordinamento delle query (ovvero , db.find().sort()
) fa seguire accuratamente il comportamento di confronto/ordinamento documentato.
Questo è, per lo meno, incoerente. Penso che varrebbe la pena inviare una segnalazione di bug al sito JIRA di MongoDB .
Risposta originale:
Non credo che questo comportamento sia un bug.
Il consenso generale per Javascript
è quello undefined
significa non assegnato mentre null
significa assegnato ma altrimenti non definito . I confronti di valore con l'indefinito, a parte l'uguaglianza, non hanno senso, almeno in senso matematico.
Dato che BSON attinge molto da JavaScript, questo vale anche per MongoDB.