Переведите MongoDB Aggregation $ all (JS) в Doctrine ODM Aggregation (PHP) - PullRequest
0 голосов
/ 15 апреля 2019

В настоящее время я пытаюсь преобразовать этот код 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 }
                }    
            },
          ] }
      }
  }
] )

(На основании официальной документации: Использовать $ all с $ elemMatch

В код ODM Doctrineиспользуя их конструктор агрегации:

$builder = $this->createAggregationBuilder();

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

Однако, по-видимому, я не могу правильно сопоставить $all, что означает, что я могу гарантировать, что все записи в коллекции выполненытребования, проверенные $elemMatch.

Оригинальный запрос MongoDB в JS, кажется, делает свое дело, но мне не удается получить те же результаты в PHP. Сейчас я даже не уверен, что Doctrine может обработать эту комбинациюиз $all и $elemMatch.

ОБНОВЛЕНИЕ:

Спасибо всем за ваши комментарии! Однако я все еще борюсь с текущим синтаксисом запроса (в PHP!) для $not / ->not(). Я уже проверил документы здесь: Doctrine ODM Docs , но не смог найти ничего полезного. (Обратите также внимание, что я использую версию 2.0 здесь).

Прямо сейчас мой запросвыглядит примерно так:

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

Но приводит к этой ошибке:

1) App \ Tests \ Repository \ IssueRepositoryTest :: testGetEsvaluationsPerWeek 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

1 Ответ

0 голосов
/ 16 апреля 2019

Так что с помощью @ neil-lunn я смог выяснить правильный запрос:

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