sql >> Databáze >  >> NoSQL >> MongoDB

Porovnávací operátory MongoDB s null

Nitty-hrubé podrobnosti

Přečtěte si Mongo/db/matcher/expression_leaf. /a> , existují v zásadě 2 případy, kdy se provádí porovnání zahrnující null :

  1. 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í s null vrátí false .
    Poznámka: Žádný jiný typ BSON nemá stejný kanonický typ jako null .
  2. Pokud cantypes.h a> jsou stejné (tj. oba prvky jsou null ), poté typ obou prvků BSON a poté provede požadované srovnání s 0 .
    Například null > null by se převedlo na (5-5) > 0 --> False protože kanonický typ null je 5.
    Podobně null < null by 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.




  1. Operátor agregačního potrubí MongoDB $max

  2. Vytvořte uživatele MongoDB, který může spravovat pouze dokumenty, které vytvořil

  3. Mongoose se nevyplňuje (.populate()) na Production (Heroku), ale funguje na Local

  4. Nelze připojit Hive s MongoDB pomocí mongo-hadoop konektoru