首页 > 解决方案 > $match 下的正则表达式不会产生结果

问题描述

我正在使用这个查询:

db.getCollection('fuelings').aggregate([ 
 {
     $match: {    
                "dateCreated" : {$gte:  "2020-08-12T00:00:00.000Z" ,$lt:  "2020-08-22T12:00:00.000Z"} 
             } 
 }] ) 

如您所见,这确实产生了结果:

在此处输入图像描述

但现在我想在 中添加另一个过滤器$match,它过滤所有"status" ( from line #9) is a digit. 所以我使用了正则表达式:

所以我添加了这个:

 $match: {  "status":/\d/ ,....

但现在它产生 0 个结果:

在此处输入图像描述

问题:

为什么会这样? \d是一个数字正则表达式。为什么它不产生结果?

标签: mongodb

解决方案


有几件事不见了。

  1. 您直接将正则表达式传递给match但文档说它只支持读取操作查询语法。但是您可以在下使用聚合操作$expr

  2. 要处理这个问题,您应该有一个regex查询,例如regexFind

  3. 但这些查询仅支持字符串

因此,您可以在匹配之前使用转换为字符串toString

  1. 游乐场- 使用find

  2. 您可以$expr游戏$match中使用

db.collection.aggregate([
  {
    $match: {
      $expr: {
        "$regexFind": {
          "input": {
            $toString: "$key"
          },
          "regex": "\\d"
        }
      }
    }
  }
])
  1. 对于 4.2 之前的版本 - 使用regex

db.collection.aggregate([{
    $project:{
        key:{
            $toString:
            "$key"} 
    }
}, 
  {
    $match: {
      "key": {
        "$regex": "\\d"
      }
    }
  }
])

推荐阅读