Doctrine MongoDB查询生成器addOr查询不返回任何结果

时间:2016-01-14 17:04:32

标签: mongodb doctrine-orm zend-framework2 query-builder

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

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过滤器添加。

通过“查询”构建器我无法获得任何结果,但是如果我自己构建查询并在像genghis这样的管理应用中运行它,我会得到预期的单个文档结果。

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

这个项目是一个已经使用了doctrine和mongo的zend2应用程序。我一般都不是mongo的专家,所以我不确定我在Query Builder中做错了什么,我得不到与直接执行查询相同的结果。我无法在堆栈或查询构建器文档中找到任何有关多个addOrs语法的额外线索的信息。

我们非常感谢任何帮助或方向,我需要查询构建器来获取一个文件,其中association = x和(field1 = val或field2 = value)。

谢谢!

1 个答案:

答案 0 :(得分:0)

真的不确定上面的确切问题是什么,但在玩完之后,切换查询构建器的顺序可以解决问题。

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();
}

如果有人了解查询构建器的内部结构,那么我们仍然希望听到一些有关其工作原理的反馈,以及上述内容。