2015-05-31 17 views
5

Sono i seguenti dati della mia collezione:Checking annidati proprietà che può essere nullo

{ colour: { r: 0, g: 0, b: 0 }}, 
{ colour: null }, 

Come posso trovare tutti i documenti che hanno colour == null o color.r tra alcuni valori?

Ho provato

.find({ where: { $or: [{colour: null}, {"colour.r": {$gt: 0, $lt: 100}}]}}) 

ma naturalmente questo mi dà cannot read property 'r' of null per le righe null.

risposta

4

Utilizzare $where solo se non v'è altro modo per esprimere la vostra richiesta

db.test.find({$or: [{"colour": null}, {"colour.r": {$gt: 0, $lt: 100}}]}) 
1

A meno che non hanno bisogno di una singola query, è possibile eseguire 2 domande:

  1. Trova tutti i documenti where color == null
  2. Trova tutti i documenti where color != null and color between 0 and 100
+0

Utilizzando due query, c'è una leggera possibilità che lo stesso documento venga restituito due volte - se è stato contemporaneamente aggiornato da un altro client. –

1

Per completezza:

db.test.find({$nor: [{"colour.r": {$lte: 0}}, {"colour.r": {$gte: 100}}]}) 

$nor corrisponderà tutti i documenti che non riescono le espressioni.

Qui, non c'è bisogno di testare in modo esplicito per null in quanto è né maggiore né inferiore a qualsiasi numero - da qui, non riuscirà i test, proprio come un qualsiasi numero nel gamma (0100)


Exclusive. Se è necessario trovare tutti i documenti compresi nell'intervallo [0,100] compreso, sostituire $gte (risp. $lte) entro il $gt (rispettivamente $lt).

Problemi correlati