将MongoDB聚合$ all(JS)转换为Doctrine ODM聚合(PHP)

问题描述 投票:0回答:1

我目前正在尝试转换此JS代码:

db.Issue.aggregate( [
  { // Filter out issues that have been worked on after our given week = All worklogs muste have been before date
      $match : { 
          worklogs: { $all: [
            { 
                "$elemMatch" : {
                    date: { $lte: endDate }
                }    
            },
          ] }
      }
  }
] )

(根据官方文件:Use $all with $elemMatch

使用其聚合构建器进入Doctrine ODM代码:

$builder = $this->createAggregationBuilder();

$aggregation = $builder
    ->match()
        ->field('worklogs')
        ->all([
            $builder->matchExpr()->elemMatch(
               $builder->expr()->field('date')->lte($week->getEndDate())
               )
       ])
;

但是,显然我无法正确匹配$all - 这意味着允许我确保集合中的所有条目都满足$elemMatch检查的要求。

JS中的原始MongoDB查询似乎可以解决这个问题,但我无法在PHP中获得相同的结果。到目前为止,我甚至不确定Doctrine能否处理$all$elemMatch的组合。

更新:

谢谢大家到目前为止的评论!然而,我仍在为$not / ->not()运算符的当前查询语法(在PHP中!)进行挣扎。我已经在这里检查了文档:Doctrine ODM Docs但找不到任何有用的东西。 (请注意,我在这里使用的是2.0版)。

现在我的查询看起来像:

->match()
    ->field('worklogs')
        ->not([
            $builder->matchExpr()->elemMatch(
                $builder->matchExpr()->field('date')->gt($week->getEndDate())
            )
        ])

但导致此错误:

1)App \ Tests \ Repository \ IssueRepositoryTest :: testGetEstimationsPerWeek MongoDB \ Driver \ Exception \ CommandException:$不需要正则表达式或文档/var/www/html/vendor/mongodb/mongodb/src/Operation/Aggregate.php:263 /var/www/html/vendor/mongodb/mongodb/src/Collection.php:223 /var/www/html/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Aggregation/Builder.php:168 /var/www/html/vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Aggregation/Stage.php:35 /var/www/html/src/Repository/IssueRepository.php:85

php mongodb doctrine doctrine-odm
1个回答
0
投票

所以感谢@ neil-lunn的帮助,我能够找到正确的查询:

->match()
    ->field('worklogs')
        ->not(
            $builder->matchExpr()->elemMatch(
                $builder->matchExpr()->field('date')->gt($week->getEndDate())
            )
        )
© www.soinside.com 2019 - 2024. All rights reserved.