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

如何在Doctrine MongoDB中使用QueryBuilderAPI按多个条件查找一个字段的文档?,mongodb,doctrine,symfony,query-builder,Mongodb,Doctrine,Symfony,Query Builder,我在MongoDB中有一个数据模型,我可以通过本机MongoDB查询成功地查询它。但是,我不能用Doctrine MongoDB ODM的查询生成器API来表达它们 这就是我的模型在MongoDB中的外观(这是一些JSON代码示例): 我想通过搜索不同的特征值组合来查找文章,例如,我想查找颜色=绿色,宽度=40的文章 但是,我无法使用Doctrine MongoDB ODM查询生成器API**为其构建查询?这就是我所尝试的: # Document/ArticleRepository.php

我在MongoDB中有一个数据模型,我可以通过本机MongoDB查询成功地查询它。但是,我不能用Doctrine MongoDB ODM的查询生成器API来表达它们

这就是我的模型在MongoDB中的外观(这是一些JSON代码示例):

我想通过搜索不同的特征值组合来查找文章,例如,我想查找颜色=绿色,宽度=40的文章

但是,我无法使用Doctrine MongoDB ODM查询生成器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查询生成器API解决我的用例?

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

# 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()
-方法来构建。但是,对于Doctrine ODM的当前版本(Beta 2),此策略不允许您向MongoDB链添加更多方法,如
.limit()


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

看起来比直接构建查询复杂得多。
# 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);