14

所以我的结果中有一个名为“城市”的字段......结果已损坏,有时是实际名称,有时是数字。以下代码显示所有记录...

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
]);

number 没有单一的类型值,因此您需要知道您拥有哪种类型的数字:

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 回答
19

为什么不使用 $regex?

db.zips.aggregate([
    {$project : {city:{$substr:["$city",0,1]}}},
    {$sort : {city : 1}}, 
    {$match: {city:{$regex:'[0-9]'}}}
])
于 2014-03-08T17:02:05.937 回答
4

只需使用:

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

这对我来说很好!

于 2015-02-06T17:54:36.623 回答
3

匹配city数字字符串的所有文档的更简单方法是使用该属性,'0' <= city <= '9'即您的聚合查询变为:

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

当使用 JohnnyHK 的正则表达式建议时,您可以$project完全节省自己的舞台。

于 2013-05-06T11:39:29.830 回答
2

您还可以使用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"] 
            }
        }
    }
]) 
于 2014-03-14T18:30:41.583 回答
1

您也可以尝试如下,使用正则表达式而不使用 $regex

db.zips.aggregate([
{$project : { city : { $substr : ["$city",0,1] } }}, 
{$sort : {city : 1}}, 
{$match: { city:/[0-9]/}}
])
于 2014-03-13T14:47:29.773 回答
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"}}},
]);
于 2015-06-24T23:53:24.880 回答
0

随着 mongodb 4.4(即将推出),您可以使用$isNumber管道运算符来检查表达式是整数还是其他 BSON 类型。

db.zips.find({ "$expr": { "$anyElementTrue": { "$isNumber": "$city" }}})

$isNumber将返回对应于表达式的 true 或 false$anyElementTrue并将返回$matched 文档。

于 2020-04-27T06:18:02.663 回答