How to say… match when field is a number… in mongodb?

后端 未结 8 529
误落风尘
误落风尘 2021-02-04 07:41

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 recor

相关标签:
8条回答
  • 2021-02-04 08:16

    An easier way to match all docs where city is a numeric string is using the property '0' <= city <= '9' i.e. your aggregation query becomes:

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

    When using JohnnyHK's suggestion of a regex you can save yourself the $project stage altogether.

    0 讨论(0)
  • 2021-02-04 08:18

    Simply use:

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

    This work fine for me!

    0 讨论(0)
  • 2021-02-04 08:18

    You can also use an in command

    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"] 
                }
            }
        }
    ]) 
    
    0 讨论(0)
  • 2021-02-04 08:23

    Use the $type operator in your $match:

    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:

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

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

    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:

    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:

    db.zips.aggregate([
        {$project : {city:{$substr:["$city",0,1]}}},
        {$sort : {city : 1}}, 
        {$match: {city: /^\d.*$/}}      // city is all digits
    ]);
    
    0 讨论(0)
  • 2021-02-04 08:25
    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 讨论(0)
  • 2021-02-04 08:28

    Why not to use $regex?

    db.zips.aggregate([
        {$project : {city:{$substr:["$city",0,1]}}},
        {$sort : {city : 1}}, 
        {$match: {city:{$regex:'[0-9]'}}}
    ])
    
    0 讨论(0)
提交回复
热议问题