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 connullrestituirà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 > nullsi tradurrebbe in(5-5) > 0 --> Falseperché il tipo canonico di null è 5.
Allo stesso modo,null < nullsi 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.