Doctrine MongoDB Query Builder addOr 查询未返回任何结果

Doctrine MongoDB Query Builder addOr query not returning any results

我正在对文档中的多个字段进行超级简单的搜索,以查看是否有任何字段具有单一值。 (注意:一些字段使用正则表达式来搜索值是否包含在字符串中)。使用查询生成器我构建了以下内容。

public function search($value, $limit, $offset=0, $orderby = '', $order='' )
{
    $regexVal =  new \MongoRegex('/^.*(\b'.str_replace(' ', '\s', $value).'\b).*?$/i');

    $query = $this->repository->createQueryBuilder();

    $query->addOr($query->expr()->field('location')->equals($regexVal));
    $query->addOr($query->expr()->field('mappedData.name')->equals($regexVal));
    $query->addOr($query->expr()->field('mappedData.first_name')->equals($regexVal));
    $query->addOr($query->expr()->field('mappedData.last_name')->equals($regexVal));
    $query->addOr($query->expr()->field('mappedData.email')->equals($value));
    $query->addOr($query->expr()->field('email')->equals($value));
    $query->addOr($query->expr()->field('organization')->equals($value));

    $query->limit($limit)
          ->skip($offset);

    if( ! empty($orderby) && $order ){
        $query->sort($orderby, $order);
    }

    return $query->getQuery()->execute();
}

如果我转储构造的查询值,我将在此要点中得到以下数组。 https://gist.github.com/jchamb/04a0400c989cd28b1841 Doctrine Filter 正在添加额外的关联字段。

通过查询生成器我没有得到任何结果,但是如果我自己构建查询并运行它在像 genghis 这样的管理应用程序中,我得到预期的单个文档结果。

实际写入的 mongodb 字符串如下所示。 https://gist.github.com/jchamb/ce60829480576a88290d

这个项目是一个已经在使用 doctrine 和 mongo 的 zend2 应用程序。一般来说,我不是 mongo 的专家,所以我不确定我在查询生成器内部做错了什么,我没有得到与直接执行查询相同的结果。我在堆栈或查询生成器文档中找不到任何信息,这些信息为 multiple addOrs 语法提供了任何额外的线索。

非常感谢任何帮助或指导,在最基本的形式中,我需要查询构建器来获取关联 = x 和(field1 = val 或 field2 = value)的文档。

谢谢!

真的不确定上面的问题到底是什么,但在尝试之后,切换查询构建器的顺序解决了问题。

public function search($value, $limit, $offset=0, $orderby = '', $order='' )
{
    $regexVal =  new \MongoRegex('/^.*(\b'.str_replace(' ', '\s', $value).'\b).*?$/i');

    $query = $this->repository->createQueryBuilder()
             ->find()
             ->limit($limit)
             ->skip($offset);

    $query->addOr($query->expr()->field('location')->equals($regexVal));
    $query->addOr($query->expr()->field('mappedData.name')->equals($regexVal));
    $query->addOr($query->expr()->field('mappedData.first_name')->equals($regexVal));
    $query->addOr($query->expr()->field('mappedData.last_name')->equals($regexVal));
    $query->addOr($query->expr()->field('mappedData.email')->equals($value));
    $query->addOr($query->expr()->field('email')->equals($value));
    $query->addOr($query->expr()->field('organization')->equals($value));

    if( ! empty($orderby) && $order ){
        $query->sort($orderby, $order);
    }

    return $query->getQuery()->execute();
}

如果有人对查询生成器的内部结构有更多了解,我仍然希望听到一些反馈,说明为什么这行得通,而上面的行不通。