Symfony mongo-odm-aggregation-bundle sums

时间:2016-04-25 13:18:13

标签: php mongodb symfony aggregation-framework

首先,我不得不说我是mongo(3.2)的新手。我正在使用mongo-odm-aggregation-bundle用于php框架Symfony(2.8.4)。我希望获得一些受日期限制的字段的总和。 到目前为止,我设法获得所有记录的总和:

$expr = new \Solution\MongoAggregation\Pipeline\Operators\Expr;
        $aq = $this->manager->getCollection('AppBundle:UserDaySums')->createAggregateQuery()->group([
                            '_id' => 'client.$id',
                            'total' => $expr->sum('$aSum'),
                        ])

现在,我想通过dateFrom,dateTo和userId限制此查询。我不确定,怎么做。我知道,我应该使用匹配功能,但我不知道如何。或者有更好的解决方案吗?

感谢您的回复!

KP

2 个答案:

答案 0 :(得分:0)

是的,您可以使用匹配功能。例如,以下假设您具有要在查询中使用的日期变量:

$expr = new \Solution\MongoAggregation\Pipeline\Operators\Expr;
$aq = $this->manager->getCollection('AppBundle:UserDaySums')->createAggregateQuery();
$dateFrom = new MongoDate(strtotime('-2 days'));
$dateTo = new MongoDate();
$userId = 'Xsgy62js0lb';

$result = $aq->match(['dateFrom'=>$dateFrom, 'dateTo'=>$dateTo, 'userId'=>$userId ])
             ->group(['_id'=>'client.$id', 'total'=>$expr->sum('$aSum') ])
             ->getQuery()->aggregate();

答案 1 :(得分:0)

就我而言,match()在MongoId对象上有些棘手。

这对我不起作用:

$userMongoId = "57321c7a2977f8de306ef648";
$aq ->match([ 'user.$id' => $expr->eq($userMongoId) ])

这有效:

$aq ->match([ 'user' => new \MongoId($userMongoId) ])

使用SolutionMongoAggregationBundle,MongoDB版本3.2.6在Symfony 3上测试。