Question: So I have a field called 'city' in my results...the results are corrupted, some times it's an actual name, sometimes it's a number. The following code displays all the records...

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

```

I need to modify this line to display only the records with a city who has a name that is a number (2,3,4, etc)....I think I can use '$match', but how?

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

```

How to say 'match when city is a number'?

the out put I get looks like this...

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

```

I'm trying to display only the records with a numeric string...this is related to a larger "homework" problem but I can't even get to the actual homework question until I get past this point.

Answer: 
Use the [`$type`](http://docs.mongodb.org/manual/reference/operator/type/) operator in your `$match`:

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

```

There isn't a single type value for number so you need to know which type of number you have:

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

```

Or use an `$or` operator to match all types of numbers:

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

```

Or even use `$not` to match all docs where `city` is not a string:

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

```

**UPDATED**

To match all docs where `city` is a numeric string you can use a regular expression:

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

```
```
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"}}},
]);

```