Szczegóły drobiazgowe
Czytanie najnowszego źródła Mongo /a> , w zasadzie są 2 przypadki, kiedy porównujemy null :
- Jeśli typy kanoniczne porównywanych elementów BSON jest różnych, tylko porównania równości (
==,>=,<=) wartości null &undefined zwrócitrue; w przeciwnym razie każde porównanie znullzwrócifalse.
Uwaga: Żaden inny typ BSON nie ma takiego samego typu kanonicznego jaknull. - Jeśli typy kanoniczne są takie same (tzn. oba elementy są
null), a następnie compareElementValu jest nazywany. Dlanull, to po prostu zwraca różnicę między canonicalL124 wpisz obu elementów BSON, a następnie przeprowadza żądane porównanie z0.
Na przykładnull > nullprzetłumaczyłoby na(5-5) > 0 --> Falseponieważ kanoniczny typ null to 5.
Podobnienull < nullprzetłumaczyłoby na(5-5) < 0 --> False.
Oznacza to null może być zawsze równe null lub undefined . Wszelkie inne porównania dotyczące null zawsze zwróci false .
Czy to błąd?
Zaktualizowana odpowiedź:
Dokumentacja operatorów porównania ($gt
, $lt
) odwołuje się do dokumentacji, do której pierwotnie linkujesz , co oznacza, że operatory porównania powinny pracuj z null . Ponadto sortowanie zapytań (tj. , db.find().sort() ) tak dokładnie postępuj zgodnie z udokumentowanym zachowaniem porównywania/sortowania.
To przynajmniej jest niespójne. Myślę, że warto zgłosić błąd na stronie MongoDB JIRA .
Oryginalna odpowiedź:
Nie sądzę, że to zachowanie jest błędem.
ogólny konsensus dotyczący JavaScript
czy to undefined oznacza nieprzypisany podczas gdy null oznacza przypisane, ale poza tym niezdefiniowane . Porównywanie wartości z niezdefiniowaną, poza równością, nie ma sensu, przynajmniej w sensie matematycznym.
Biorąc pod uwagę, że BSON czerpie dużo z JavaScript, dotyczy to również MongoDB.