Nat*_*han 1 php doctrine mapreduce mongodb doctrine-odm
我有一个文档集合,我想通过某个字段查询,按字段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();
Run Code Online (Sandbox Code Playgroud)
但是因为location每个具有不同的特定条目可以有多个条目pos,所以我必须创建一个foreach循环来操作之后的数据.在这种情况下,我可以采用该快捷方式只是在返回数据后更改数据,但我还有其他情况,根本不能这样做.所以我创建了这个较小的场景,试图找出如何使用Doctrine ODM的group查询,甚至是映射和减少它.不确定最好的方法.我看到很多获得跑步总数等的例子.
那么我如何创建一个查询来获得pos每个特定字段中最高的数值location?知道可能存在多个具有相同location但不同pos值的文档.最重要的是,拥有我在上面列出的所选记录的所有字段->select()
您可以使用以下内容进行分组,而不是使用Map Reduce分组:
distinct:如何使用MongoDB"分组"$group:http://docs.mongodb.org/manual/reference/aggregation/group/请注意,我相信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 ) )
)
));
Run Code Online (Sandbox Code Playgroud)
这将为你运行聚合,它不会是你想要的,我不认为,但玩它.