Utilisez le $type
opérateur dans votre $match
:
db.zips.aggregate([
{$project : {city:{$substr:["$city",0,1]}}},
{$sort : {city : 1}},
{$match: {city: {$type: 16}}} // city is a 32-bit integer
]);
Il n'y a pas de valeur de type unique pour le nombre, vous devez donc savoir quel type de nombre vous avez :
32-bit integer 16
64-bit integer 18
Double 1
Ou utilisez un $or
opérateur pour faire correspondre tous les types de nombres :
db.zips.aggregate([
{$project : {city:{$substr:["$city",0,1]}}},
{$sort : {city : 1}},
{$match: {$or: [{city: {$type: 1}}, {city: {$type: 16}}, {city: {$type: 18}}]}}
]);
Ou même utiliser $not
pour correspondre à tous les documents où city
n'est pas une chaîne :
db.zips.aggregate([
{$project : {city:{$substr:["$city",0,1]}}},
{$sort : {city : 1}},
{$match: {city: {$not: {$type: 2}}}} // city is not a string
]);
MISE À JOUR
Pour faire correspondre tous les documents où city
est une chaîne numérique, vous pouvez utiliser une expression régulière :
db.zips.aggregate([
{$project : {city:{$substr:["$city",0,1]}}},
{$sort : {city : 1}},
{$match: {city: /^\d.*$/}} // city is all digits
]);