考虑以下简单集合:
{
"_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。
答案 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" }
}
}
}
])