微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在跳过和限制应用聚合构建器之前获取记录总数 symfony

如何解决在跳过和限制应用聚合构建器之前获取记录总数 symfony

我在 TransactionRepository.PHP 中有以下查询

    //Query Builder
    $qb = $this->createqueryBuilder();

    //Aggregation Builder
    $builder  = $this->getDocumentManager()->createAggregationBuilder(Transaction::class);

    //pagination request from frontend
    $start = $filters['start'];
    $length = $filters['length'];

    //query conditions
    if ($filters['query']) {
        $r = new \MongoRegex('/'.$filters['query'].'/i');
        try {
            $builder -> match()
                        ->addAnd(
                            $qb->expr()
                                ->addOr($qb->expr()->field('id')->equals(new ObjectId($filters['query'])))
                        );
        }catch (\Exception $e) {
            $builder -> match()
                        ->addAnd(
                            $qb->expr()
                                ->addOr($qb->expr()->field('externalId')->equals($r))
                                ->addOr($qb->expr()->field('buyerIdentifier')->equals($r))
                                ->addOr($qb->expr()->field('paddedCardNumber')->equals($r))
                                ->addOr($qb->expr()->field('buyerIdentifier')->equals($r))
                                ->addOr($qb->expr()->field('providerBrandName')->equals($r))
                                ->addOr($qb->expr()->field('securityWord')->equals($r))
                        );
        }
    }

    if ($filters['merchants']) {
        array_walk($filters['merchants'],function (&$i) {
            $i = new \MongoId($i);
        });
        $builder -> match()
                    -> addAnd(
                        $qb->expr()->addAnd($qb->expr()->field('merchantId')->in($filters['merchants']))
                    );
    }


      $builder
        ->lookup('companies')
        ->localField('merchantId')
        ->foreignField('_id')
        ->alias('merchant')

        //flatten the result
        ->unwind('$merchant');

    if ($filters['hydrate']) {
        $builder -> hydrate(Transaction::class);
    } else {
        $builder ->project()
            ->includeFields([
                'id','merchant._id','merchant.TradingName','state','provider','amount','created','currency','history'
            ]);
    }

    $builder ->sort(['created' => 'DESC']);

    if (!is_null($start) && !is_null($length)) {
        $builder    ->skip($start)
                    ->limit($length);
    }

    return $builder ->execute(["allowdiskUse" =>true])->toArray();

我想在 skip()limit() 应用之前有一个总数。 假设 $start =0$length = 10,我的 MongoDB 中总共有 100 条记录,我想在 limit 应用之前将总记录数绑定。我怎样才能做到这一点?我知道我必须使用 facet() 但我不知道如何在aggregationBuilder 中实现它。提前致谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。