1

我有一个文档集合,我想通过某个名为 的字段进行查询,按字段location对它们进行排序,并且只返回每个字段pos的最大值。pos

所以现在的查询看起来像这样:

$locations = array(1,2,3,4,5,6);

   $results = $this->dm->createQueryBuilder('\App\Document\Test')
        ->select('id', 'word', 'pos','change', 'title', 'coll_at', 'location')
        ->field('location')->in($locations)
        ->sort('location', 'asc')
        ->sort('pos', 'asc')
        ->getQuery()->execute();

location但是因为对于每个具有不同的特定条目可以有多个条目pos,所以我必须创建一个 foreach 循环以在之后操作数据。在这种情况下,我可以采用这种捷径,只是在数据返回后更改数据,但在其他情况下,这样做根本没有效率。所以我创建了这个较小的场景来尝试找出如何使用 Doctrine ODM 的group查询,甚至映射和减少它。不确定最好的方法。我看到很多获得运行总数的例子,等等。

pos那么我将如何创建一个查询来获取每个特定字段中的最高数值location?知道可以有多个文档具有相同location但不同的pos值。最重要的是,拥有我在上面列出的所选记录的所有字段->select()

4

2 回答 2

5

您可以使用以下方式进行分组,而不是使用 Map Reduce 进行分组:

请注意,我相信 Doctrines distinct 的默认实现实际上适用于group()MongoDB 的旧命令,它基本上是一个 MR 包装但是:

那么我将如何创建一个查询来获取每个特定位置的 pos 字段中的最高数值

这可能有效,但是如果没有,那么您将需要使用聚合框架,但是在 Doctrine 中,这有点困难,因为他们似乎没有真正的助手可以链接到其框架的其余部分:https:/ /github.com/doctrine/DoctrineMongoDBBundle/issues/165所以你必须command运行它的函数。

编辑

我自己有点学说菜鸟,所以这取自示例:

$connection = $this->get('doctrine_mongodb')->getConnection();
$mongo = $connection->getMongo();
if(!$mongo){
    $connection->connect();
    $mongo = $connection->getMongo();
}
$db = $mongo->selectDB('test_database');
$aggregate_results = $db ->command(array( 
            "aggregate" => "my_collection",
            "pipeline" => 
                array( 
                    array( '$group' => array( 'location' => '$location', 'pos' => array('$sum' => '$pos'))),
                    array( '$sort' => array( "pos" =>1 ) )
                )
        ));

这将为您运行聚合,它不会完全是您想要的我不认为但可以玩弄它。

于 2012-12-13T08:27:07.057 回答
0

除了Sammaye的回答。Doctrine ODM 确实支持组查询:

http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/query-builder-api.html#group-queries

于 2014-07-29T10:02:11.960 回答