Nitty-hrubé podrobnosti
- Pokud cantypes.h a> z porovnávaných prvků BSON se liší, pouze porovnání rovnosti (
==,>=,<=) z null &undefined vrátítrue; jinak jakékoli srovnání snullvrátífalse.
Poznámka: Žádný jiný typ BSON nemá stejný kanonický typ jakonull. - Pokud cantypes.h a> jsou stejné (tj. oba prvky jsou
null), poté typ obou prvků BSON a poté provede požadované srovnání s0.
Napříkladnull > nullby se převedlo na(5-5) > 0 --> Falseprotože kanonický typ null je 5.
Podobněnull < nullby se převedlo na(5-5) < 0 --> False.
To znamená null může být vždy rovno null nebo undefined . Jakékoli jiné srovnání zahrnující null vždy vrátí false .
Je to chyba?
Aktualizovaná odpověď:
Dokumentace pro operátory porovnání ($gt
, $lt
) odkazuje na dokumentaci, na kterou jste původně odkazovali , což znamená, že operátory porovnání by měly pracovat s null . Dále řazení dotazů (tj. , db.find().sort() ) dělá přesně dodržujte zdokumentované chování při porovnávání/třídění.
To je přinejmenším nekonzistentní. Myslím, že by stálo za to odeslat hlášení o chybě na stránku JIRA MongoDB .
Původní odpověď:
Nemyslím si, že toto chování je chyba.
obecný konsensus pro Javascript
je to undefined znamená nepřiřazeno zatímco null znamená přiřazeno, ale jinak nedefinováno . Porovnání hodnot s nedefinovanými, kromě rovnosti, nedávají smysl, alespoň v matematickém smyslu.
Vzhledem k tomu, že BSON hodně čerpá z JavaScriptu, platí to i pro MongoDB.