jenssegers/laravel-mongodb中where子句中的正则表达式不起作用

5

我正在使用jenssegers/laravel-mongodb开发一个基于MongoDB数据库的Laravel API。

我正试图使用正则表达式来过滤获取一些特定的数据。在这个插件的教程中,我找到了以下内容:

User::where('name', 'regex', new MongoRegex("/.*doe/i"))->get();

所以我的代码看起来像这样:
School::where('name', 'regex', new MongoRegex("/haags/i"))->get();

但结果为空。当我输出查询时,它看起来像这样:
db.schools.find({"name":{"$regex":{"regex":"haags","flags":"i"}}})

当我在控制台中使用该查询时,它会显示:

error: {
    "$err" : "Can't canonicalize query: BadValue $regex has to be a string",
    "code" : 17287
}

我也尝试过:

School::where('name', 'regexp', "/haags/i")->get();

但这给了我这个查询:

db.schools.find({"name":{"$regex":"\/haag\/i"}})

这似乎可以避免斜杠并使正则表达式无效。除此之外,正则表达式不应该用引号括起来,或者应该像MongoDB手册中找到的那样:

db.products.find( { description: { $regex: /^S/, $options: 'm' } } )

在转换为MongoDB查询时,出现了问题,或者是我做错了什么。请问有人能告诉我这是什么问题吗?


你解决了你的问题吗?我也有同样的问题;-) 谢谢 - hotips
我停止使用mongoDB并转向其他方案,因为它存在太多问题... - gidomanders
2016-07-31 - 这里也有同样的问题... - felipsmartins
1个回答

0
我找到了问题所在: 它实际上位于Builder类中的compileWhereBasic函数中。
当where条件有3个参数时,中间运算符会被添加在前面
例如{$regexp => { $regexp : "a", $options : "i"}}第一个"$regexp"是被添加的运算符。但是对于=(已经正确处理)和regexp不应该被添加。 更正如下:
if (! isset($operator) or in_array($operator, ['=','regex']) ) {
        $query = [$column => $value];
    } elseif (array_key_exists($operator, $this->conversion)) {
        $query = [$column => [$this->conversion[$operator] => $value]];
    } else {
        $query = [$column => ['$' . $operator => $value]];
    }

用原始代码不如:

if (! isset($operator) or $operator == '=') {
        $query = [$column => $value];
    } elseif (array_key_exists($operator, $this->conversion)) {
        $query = [$column => [$this->conversion[$operator] => $value]];
    } else {
        $query = [$column => ['$' . $operator => $value]];
    }

希望这有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接