14

そのため、結果に「city」というフィールドがあります...結果が壊れており、実際の名前である場合もあれば、数字である場合もあります。次のコードは、すべてのレコードを表示します...

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

この行を変更して、都市名が数字 (2、3、4 など) のレコードのみを表示する必要があります。「$match」を使用できると思いますが、どうすればよいでしょうか?

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

「市区町村が数字の場合に一致」とは?

私が得たアウトプットはこのように見えます...

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

数値文字列を含むレコードのみを表示しようとしています...これはより大きな「宿題」の問題に関連していますが、この時点を過ぎるまで実際の宿題の問題に到達することさえできません。

4

8 に答える 8

30

$typeで演算子を使用します$match

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

数値には単一の型の値がないため、どの型の数値を持っているかを知る必要があります。

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

または、$or演算子を使用してすべてのタイプの数値に一致させます。

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

または、文字列ではない$notすべてのドキュメントに一致させるために使用することもできます:city

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

更新しました

が数値文字列であるすべてのドキュメントに一致させるにcityは、正規表現を使用できます。

db.zips.aggregate([
    {$project : {city:{$substr:["$city",0,1]}}},
    {$sort : {city : 1}}, 
    {$match: {city: /^\d.*$/}}      // city is all digits
]);
于 2012-11-16T02:32:48.897 に答える
4

単純に使用します:

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

これは私にとってはうまくいきます!

于 2015-02-06T17:54:36.623 に答える