2012-11-16 7 views
12

Więc mam pole o nazwie "miasto" w moich wynikach ... wyniki są uszkodzone, czasami jest to prawdziwe imię, czasami jest to liczba. Poniższy kod wyświetla wszystkie rekordy ...How to say ... mecz, gdy pole jest numerem ... w mongodb?

db.zips.aggregate([{$project : {city:{$substr:["$city",0,1]}}},{$sort : {city : 1}} ]) 

muszę modyfikować tę linię, aby wyświetlić tylko rekordy z miasta, który ma nazwę, która jest liczbą (2,3,4, itp) .. ..Myślę, że mogę użyć "$ match", ale jak?

db.zips.aggregate([{$project : {city:{$substr:["$city",0,1]}}},{$sort : {city : 1}}, {$match:{???what_to_say_here???} ]) 

Jak powiedzieć "mecz, gdy miasto jest numerem"?

obecnie wprowadzone mam wygląda następująco ...

{ 
     "city" : "A", 
     "_id" : "04465" 
    }, 
    { 
     "city" : "1", 
     "_id" : "02821" 
    }, 
    { 
     "city" : "0", 
     "_id" : "04689" 
    } 

Próbuję wyświetlić tylko rekordy z ciągiem liczbowym ... jest to związane z większym „pracy domowej” problem ale nie mogę nawet dostać się do pytania o pracę domową, dopóki nie przejdę przez ten punkt.

+0

Na szczęście praca domowa nie jest "zgodna, gdy pole jest liczbą". – thefonso

+0

@AndredeFrere Celem kursu online "alpha" (nawet beta) jest zdobycie większej liczby programistów zaangażowanych w używanie oprogramowania ... nie obrażajcie się, jeśli szukamy pomocy w kwestiach, które mogą wymagać niewielkiej korekty dostępność przez niezależnych ekspertów mongoDB. – thefonso

+0

Bez urazy i przeprosin, jeśli ktoś je otrzymał, po prostu nie chciał, aby ktokolwiek się porwał i dawał aktualne odpowiedzi na pracę domową. –

Odpowiedz

30

Użyj operatora $type w $match:

db.zips.aggregate([ 
    {$project : {city:{$substr:["$city",0,1]}}}, 
    {$sort : {city : 1}}, 
    {$match: {city: {$type: 16}}}  // city is a 32-bit integer 
]); 

Nie jest pojedyncza wartość dla liczby typu więc trzeba wiedzieć, jaki rodzaj masz numer:

32-bit integer 16 
64-bit integer 18 
Double   1 

Lub użyj operatora $or, aby dopasować wszystkie typy liczb:

db.zips.aggregate([ 
    {$project : {city:{$substr:["$city",0,1]}}}, 
    {$sort : {city : 1}}, 
    {$match: {$or: [{city: {$type: 1}}, {city: {$type: 16}}, {city: {$type: 18}}]}} 
]); 

Albo nawet użyć $not dopasować wszystkie dokumenty gdzie city nie jest ciągiem:

db.zips.aggregate([ 
    {$project : {city:{$substr:["$city",0,1]}}}, 
    {$sort : {city : 1}}, 
    {$match: {city: {$not: {$type: 2}}}}  // city is not a string 
]); 

AKTUALIZACJA

Aby dopasować wszystkie dokumenty gdzie city to ciąg liczbowy można użyć wyrażenia regularnego:

db.zips.aggregate([ 
    {$project : {city:{$substr:["$city",0,1]}}}, 
    {$sort : {city : 1}}, 
    {$match: {city: /^\d.*$/}}  // city is all digits 
]); 
+0

Hmmm, wszystko, co otrzymuję, to "{" wynik ": [ ], "ok": 1} ".... Mam nadzieję, że faktycznie pokażę wynik z powrotem – thefonso

+0

@ thefonso Kiedy mówisz, że miasto jest liczbą, zakładałem, że był to typ liczbowy, czy miałeś na myśli tylko to, ciąg numeryczny? – JohnnyHK

+0

ah..Tak jest ciąg numeryczny – thefonso

3

Łatwiejszy sposób dopasowania wszystkich dokumentów, w których city jest łańcuchem numerycznym, śpiewać własnością '0' <= city <= '9' tj zapytanie agregacja staje:

db.zips.aggregate([ 
    {$project : {city:{$substr:["$city",0,1]}}}, 
    {$sort : {city : 1}}, 
    {$match: {city: {$gte: '0', $lte: '9'}}} 
]); 

Podczas korzystania sugestię JohnnyHK dotyczącą regex można zapisać się na scenę $project całkowicie.

+0

To jest najlepsza odpowiedź. Nie jest to kruchy, jak sprawdzanie kodu typu, nie jest powolny jak dopasowanie regex. Ta metoda może nawet w niektórych przypadkach użyć indeksu, ale nie w tym. – Mzzl

19

Dlaczego nie używać wyrażenia $ regex?

db.zips.aggregate([ 
    {$project : {city:{$substr:["$city",0,1]}}}, 
    {$sort : {city : 1}}, 
    {$match: {city:{$regex:'[0-9]'}}} 
]) 
1

można także spróbować jak poniżej, używając wyrażeń regularnych bez użycia $ regex

db.zips.aggregate([ 
{$project : { city : { $substr : ["$city",0,1] } }}, 
{$sort : {city : 1}}, 
{$match: { city:/[0-9]/}} 
]) 
2

Można również użyć komendy in

db.zips.aggregate([  
    { 
     $project: { 
      first_char: { 
       $substr : ["$city",0,1] 
      }, 
      "_id":"$_id" 
     } 
    }, 
    { 
     $match: { 
      first_char: { 
       $in: ["0","1","2","3","4","5","6","7","8","9"] 
      } 
     } 
    } 
]) 
+1

Czy "{$ match: {first_char: {$ gte:" 0 ", $ lte:" 9 "}}}' byłoby prostszym rozwiązaniem? – sunside

4

Wystarczy użyć:

db.zips.aggregate([ 
{$match: { 
    'city': { $regex: '^[0-9].*'} 
}}]) 

To działa dobrze dla mnie!

+0

Również '{$ match: {city:/^ \ d + /}}'. Myślę, że jest to najbardziej rozsądne rozwiązanie, ponieważ będzie mógł użyć indeksu '{city: 1}'. – sunside

1
db.zips.aggregate([ 
    {$project : {city:{$substr:["$city",0,1]},pop:1}}, 
    {$group:{_id:"$city",sumPop:{$sum:"$pop"}}}, 
    {$sort : {_id : 1}}, 
    {$match:{_id : {$regex:/\d/}} }, 
    {$group:{_id:"id",sumPop:{$sum:"$sumPop"}}}, 
]); 
+0

Nie potrzebujemy polecenia sortowania, ponieważ filtrujemy dane w oparciu o cyfrę. –

Powiązane problemy