2013-06-13 17 views
10

Jak mogę sprawdzić zapisy filtrowanie w pole, które ma wartość undefined:Jak dopasować wartość "niezdefiniowaną" w MongoDB Aggregation Framework?

db.records.aggregate({ 
    $match: { 
     myField: "undefined", 
    } 
}) 
+2

Jak zdefiniować niezdefiniowana? Masz na myśli coś takiego jak ['$ exists'] (http://docs.mongodb.org/manual/reference/operator/exists/)? Jeśli to możliwe, dodaj przykładowy dokument i regularne zapytanie, które je zwróci. Patrząc na twoje pytanie, '' undefined'' jest ciągiem, tak jak '' Hello, World! ''. – ixe013

Odpowiedz

19

Jeśli chcesz odfiltrować dokumenty, które mają kilka pól brakuje, użyj operatora $exists.

To działa na moim komputerze:

> db.test.drop() 
true 
> db.test.insert({'Hello':'World!', 'myField':42}) 
> db.test.insert({'Hello again':'World!'}) 
> db.test.aggregate({'$match':{ 'myField':{'$exists':false} }}) 
{ 
     "result" : [ 
       { 
         "_id" : ObjectId("51b9cd2a6c6a334430ec0c98"), 
         "Hello again" : "World!" 
       } 
     ], 
     "ok" : 1 
} 

dokumentu, który ma myField prezent nie pokazuje się w wynikach.

+5

Operator [$ type] (http://docs.mongodb.org/manual/reference/operator/type/) jest również dostępny do wyszukiwania pól z wartościami 'null' (istnieje również wycofany typ' undefined'). Ten wpis [FAQ] (http://docs.mongodb.org/manual/faq/developers/#how-do-i-query-for-fields-that-have-null-values) wyjaśnia zapytanie o wartości null i/lub brakujące pola (te same operatory są dostępne dla struktury agregacji). Na przykład: 'db.test.aggregate ({'$ match': {'myField': {'$ type': 10}}}))" pasowałoby do dokumentów, dla których zdefiniowano 'myField', ale ma wartość' null' . – jimoleary

24

Filtr go $type:6 (mongodb referece, uwaga, że ​​tego typu oznaczone jako 'przestarzałe'):

db.records.aggregate({ 
    $match: { 
     myField: {'$type':6}, 
    } 
}) 
+3

Dzięki za to. Przyjęta odpowiedź nie wydaje się właściwie odpowiadać na pytanie, ale robi to i jest niesamowicie przydatna, jeśli spróbujesz wyszukać "niezdefiniowane", oznacza to, że nie możesz. – Chris