MongoDB按正则表达式条件添加字段

时间:2018-08-12 05:33:49

标签: mongodb aggregation-framework

考虑以下简单集合:

{ 
    "_id" : ObjectId("5b6fbcb328d62424ece9265b"), 
    "name" : "abc"
}
{ 
    "_id" : ObjectId("5b6fbcbd28d62424ece9265c"), 
    "name" : "cde"
}

我想添加一个字段hasA,该字段确定聚合查询的name字段中是否有任何'a'字符,因此我的预期输出应如下所示:

{ 
    "_id" : ObjectId("5b6fbcb328d62424ece9265b"), 
    "name" : "abc",
    "hasA" : true
}
{ 
    "_id" : ObjectId("5b6fbcbd28d62424ece9265c"), 
    "name" : "cde",
    "hasA" : false
}

我已经测试了此聚合查询,但返回错误输出:

$addFields
{
    "hasA": { $cond : [ {name : /a/}, true, false ] }
}

输出:

{ 
    "_id" : ObjectId("5b6fbcb328d62424ece9265b"), 
    "name" : "abc", 
    "hasA" : true
}
{ 
    "_id" : ObjectId("5b6fbcbd28d62424ece9265c"), 
    "name" : "cde", 
    "hasA" : true
}

我已经使用此查询测试了许多数据,但似乎结果总是返回true。

2 个答案:

答案 0 :(得分:1)

您不能在Aggregation Framework中使用正则表达式(JIRA票据here)。如果只需要检查字符串是否包含子字符串,则可以使用$indexOfBytes运算符,如果不匹配,则返回-1

db.col.aggregate([
    {
        $addFields: {
            "hasA": { $cond : [ { $eq: [ { $indexOfBytes: [ "$name", "a" ] }, -1 ] }, false, true ] }
        }
    }
])

答案 1 :(得分:0)

在 Mongo 4.2 及更高版本中可以使用 $regexMatch

db.collection.aggregate([
  {
    $addFields: {
      "hasA": {
        $regexMatch: { input: "$name", regex: "a" }
      }
    }
  }
])