2012-02-16 18 views
17

Moja kolekcja (MongoDB v 2.0.2) ma następujące wyniki:zapytań MongoDB o wartości zerowej

db.organization.find({}) 
{ "_id" : 1001, "path" : [ ], "parent" : null } 
{ "_id" : 1002, "path" : [ 1001 ], "parent" : NumberLong(1001) } 

organization zawiera indeksy:

db.organization.ensureIndex({"path":1}); 
db.organization.ensureIndex({"parent":1},{sparse:false}); 

(uwaga kładę awarnes sparse : false - przyznać, że NULL jest indeksowana) Ale wykonanie:

db.organization.find({"parent":null}) 

Returns pusty zestaw. Co jest nie tak? Z góry dziękuję

+0

Czy nadal występują problemy z tym? Czy możesz podać dane wyjściowe db.system.indexes.find(), a także db.organization.find(). Explain()? – Barrie

+0

@ Barrie, teraz nie mogę odtworzyć tego błędu. Jestem prawie pewien, że został osiągnięty przez wielokrotne zastosowanie skryptów 'js' z narzędzia wiersza poleceń. Tym razem zacząłem "wyjaśniać", aby rozpoznać błąd, ale pokazało normalne użycie indeksów – Dewfy

Odpowiedz

6

Tylko sprawdzone następujący skrypt na 2,0 i 2.0.2:

db.items.insert({ "_id" : 1001, "path" : [ ], "parent" : null }) 
db.items.insert({ "_id" : 1002, "path" : [ 1001 ], "parent" : NumberLong(1001) }) 
db.items.ensureIndex({"path":1}); 
db.items.ensureIndex({"parent":1},{sparse:false}); 
db.items.find({"parent":null}) 

rzeczywiście powraca jeden dokument, który można oczekiwać:

{ "_id" : 1001, 
    "path" : [], 
    "parent" : null } 

Ponadto można zajrzeć do tego dokumentu o querying and nulls prawdopodobnie pomoże ci uniknąć potencjalnych błędów w przyszłości.

+0

to trochę magii. Ty przykład z 'items' działa, ale moje jest do bani. – Dewfy

18

Miałem ten sam problem. Po zapoznaniu się z następującymi dokumentami

Próbowałem kwerendy dla różnych typów elementów BSON i okazało się, że mój zerowy został przedstawiony jako typ elementu BSON 6 (niezdefiniowany, przestarzałe) zamiast oczekiwanego elementu BSON wpisz 10 (null).

db.collection.find({ field: { "$type" : 6} }; 
+3

na podstawie pierwszego linku, myślę, że powinno to być 'db.collection.find ({pole: {" $ typ ": 10}};' – AbdelHady

+1

@AbdelHady: Być może dokumenty reprezentują uproszczoną wersję rzeczywistości. używać '{field: {$ type: 6}}' w 'update', gdzie naprawdę chcę powiedzieć' {field: null} '. –

+2

@AbdelHady: Zdrap to, myślę, że' {$ typ: 10} ' Naprawdę jest to słuszne i po prostu się myliłem. –

Powiązane problemy