mongodb - 如何在 Doctrine MongoDB 中使用 QueryBuilderAPI 通过多个条件查找一个字段的文档?

标签 mongodb doctrine symfony query-builder

我在 MongoDB 中有一个数据模型,我可以通过 native MongoDB 查询成功查询它。但是,我无法使用 Doctrine MongoDB ODM 的查询生成器 API 来表达它们。

这是我的模型在 MongoDB 中的样子(这是一些示例 JSON 代码):

{ "name": "ArticleName", 
  "features": {
    { "type": "color",
      ...
      "values": {
        { "value": "RED", 
          "label": "red",
          ....
        },

        { "value": "GREEN", 
          "label": "green" }
      } 
    },
    { "type": "width",
      "values": {
        { "value": "40"}
      } 
    }
  }
}

我想通过搜索不同的特征值组合来查找文章,例如我想找一篇 color=green 和 width=40 的文章。

但是,我无法使用 Doctrine MongoDB ODM Query Builder API 构建查询**?这是我尝试过的:

# Document/ArticleRepository.php    

$features = array('color'=>'RED', 'width'=>'40');
$qb = $this->createQueryBuilder('CatalogBundle:Article'); // I use symfony 2
foreach ($features as $type => $value)
{
    $qb->field('features')->elemMatch(
        $qb->expr()->field('type')->equals($type)->field('values')->elemMatch(
            $qb->expr()->field('value')->equals($value)
        )
    );
}
return $qb->getQuery()->execute();

然而,这确实会导致一个只包含一个条件的查询。另一个条件似乎被覆盖了。这是查询生成器生成的查询:

db.articles.find({ "features": { "$elemMatch": { "type": "width", "values": { "$elemMatch": { "value": 40 } } } } })

有没有办法使用 MongoDB ODM Query Builder API 解决我的用例?

最佳答案

我同时使用 $all-Operator 解决了我的问题。我构建了一个表达式数组,这些表达式被传递给 Doctrine MongoDB all()-Method。我在上面尝试过的 $elemMatch 策略甚至不适用于 MongoDB。您必须在末尾添加 ->getQuery() 才能将表达式写入数组。由于某些原因,表达式尚未记录,但是您可以在 source code 中检查它们的功能。

# Document/ArticleRepository.php

$features = array('color'=>'RED', 'width'=>'40');
$qb = $this->createQueryBuilder('CatalogBundle:Article');
$all_features[] = array();

foreach ($features as $templateID => $value)
{
    # Add expression as a subquery to array
    $all_features[] = $qb->expr()->elemMatch(
        $qb->expr()->field('templateID')->equals($templateID)->field('values')->elemMatch(
            $qb->expr()->field('value')->equals($value)
        )
    )->getQuery();
}
# Add expressions to query
$qb->field('features')->all($all_features);

表达式几乎支持您在构建查询时可以使用的所有方法。您可以通过交错几个表达式来构建您的 MongoDB 请求。这允许您构建复杂的 MongoDB 查询,否则您只能通过将数组传递给 findBy()-Method 来构建。然而,对于 Doctrine ODM 的当前版本(Beta 2),此策略不允许您向 MongoDB 链添加更多方法,例如 .limit()

因此表达式看起来是使用 Doctrine MongoDB 构建复杂查询的最佳策略。

关于mongodb - 如何在 Doctrine MongoDB 中使用 QueryBuilderAPI 通过多个条件查找一个字段的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5693575/

相关文章:

mongodb - 从客户端插入时在 Meteor 服务器端丰富 Mongo 文档?

mysql - Symfony 3.4 getDoctrine() 导致错误

symfony - Doctrine 中的 Dql 选择 vs sql 查询

Symfonydustin10/VichUploaderBundle 事件

mongodb - 是否可以在聚合框架 mongo 中按投影顺序获取字段

node.js - 当 cron 在后台运行时,没有 Mongo 查询得到结果

php - 在 Doctrine 2 的一个领域中处理多个关系

mysql - 来自 127.0.0.1 的 TIME_WAIT 过多

mongodb - 具有不同 $match 的嵌套 $group

php - 如何在 postRemove 事件期间获取实体的对象 ID?