【问题标题】:Doctrine MongoDB Query Builder addOr query not returning any resultsDoctrine MongoDB Query Builder addOr 查询不返回任何结果
【发布时间】:2016-01-14 17:04:32
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    如果有人更了解查询生成器的内部结构,我仍然希望听到一些关于为什么这样做有效的反馈,而上述内容没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2012-07-26
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      相关资源
      最近更新 更多