MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Operatori di confronto MongoDB con null

Dettagli nitidi

Leggere l'ultima fonte Mongo , ci sono fondamentalmente 2 casi quando si eseguono confronti che coinvolgono null :

  1. Se i tipi canonici degli elementi BSON confrontati sono diversi, solo confronti di uguaglianza (== , >= , <= ) di null &undefined restituirà true; altrimenti qualsiasi confronto con null restituirà false .
    Nota: Nessun altro tipo BSON ha lo stesso tipo canonico di null .
  2. Se i tipi canonici sono gli stessi (cioè, entrambi gli elementi sono null ), quindi compareElementValues è chiamato. Per null , questo restituisce solo la differenza tra il canonico digita di entrambi gli elementi BSON e quindi esegue il confronto richiesto con 0 .
    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.