2015-05-31 14 views
5

Mam następujące dane w mojej kolekcji:Sprawdzanie zagnieżdżone właściwość, że może być null

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

Jak mogę znaleźć wszystkie dokumenty, które mają colour == null lub color.r między niektórych wartości?

Próbowałem

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

ale oczywiście to daje mi cannot read property 'r' of null dla zerowych wierszy.

Odpowiedz

4

Zastosowanie $where tylko wtedy, gdy nie ma innego sposobu, aby wyrazić zapytanie

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

Chyba nie trzeba jedno zapytanie, można uruchomić 2 zapytania:

  1. Znajdź wszystkie dokumenty where color == null
  2. Znajdź wszystkie dokumenty where color != null and color between 0 and 100
+0

Stosując dwa zapytania, istnieje niewielka szansa na to, że ten sam dokument zostanie zwrócony dwukrotnie - jeśli był on jednocześnie aktualizowany przez innego klienta. –

1

Dla Uzupełniająco:

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

$nor będzie pasował do wszystkich dokumentów, które zawodzą wyrażeń.

Tutaj nie trzeba jawnie przetestować null gdyż nie jest ani większa ani mniejsza niż dowolnej liczby - stąd nie powiedzie testy, podobnie jak w dowolnej liczbie zakres (0100)


Exclusive. Jeśli potrzebujesz znaleźć każdy dokument w zakresie [0,100] włącznie, zamień $gte (lub $lte) przez $gt (lub $lt).

Powiązane problemy