Обход проблемы при фильтрации внедренного документа в проекции - PullRequest
0 голосов
/ 18 декабря 2018

Я делаю вложенный запрос поиска и проекции на таблицу ученика с таблицей активности, которая дает желаемые поля, кроме одного поля, например «StudentsForSmallShirt».Это поле пустое.

Код

  $query = ["is_temp_deleted"=>0, "funRun" => "Yes"];

        $pipeline = array(
            array(
                '$match' => $query
            ),
            array(
                '$lookup' => array(
                   ....
                 ),
              ['$lookup'=> [
                  ....
              ]],
             ['$project' => [
                '_id' => 1.0,
                'activityName' => 1.0,
                'studentsOfWeekgroup' => [
                    '$filter' => [
                        'input' => '$Students',
                        'as' => 'item',
                        'cond' => [
                           ....
                        ]
                    ]
                ],
               ..
               ]],

            [
             '$lookup' => [
                  ....
              ]
           ],
           [
            '$lookup' => [
              ....
             ]
           ], 
            [
             '$lookup' => [
                ...
             ]
           ], 
            ['$project' => [
                '_id' => 1.0,
                'activityName' => 1.0,
                'studentsOfWeekgroup' => 1.0,       
                'studentsForSmallShirt' => [
                  '$filter' => [
                    'input' => '$studentsOfWeekgroup',
                     'as' => 'items',
                     'cond' => [
                        '$and' => [
                          ['$eq' =>['$$items.activity_details.shirtSize','S']],
                          ['$eq' =>['$$items.activity_details.activityId','$_id']],
                          ['$eq' =>['$$items.activity_details.weekgroupId', new MongoDB\BSON\ObjectID($this->id)]],
                         ] 
                       ]
                    ]
                ], 
               ...
             ]], 
         );

    $cursor =  $this->db->activitiesTbl->aggregate($pipeline)->toArray();

Я проверил в консоли, что данные в "studentOfWeekgroup" выглядят как

   0 =>
    "_id": ObjectId("5bf518378d03ec0b2400536f"),
    "ssn_Last_four": "0001",
    "first_name": "Thomas",
    "activity_details": [
     {
      "studentId": ObjectId("5bf518378d03ec0b2400536f"),
      "funrun": "Yes",
      "weekgroupId": ObjectId("5bf50bd48d03ec0b2400536d"),
      "activityId": ObjectId("5c10a0e08d03ec1834001c7a"),
      "attending": "Yes",
      "shirtSize": "M",  
       "id": ObjectId("5c10e5ae3250041188005dde") 
     },
     {
      "studentId": ObjectId("5bf518378d03ec0b2400536f"),
      "funrun": "Yes",
      "weekgroupId": ObjectId("5bf50bd48d03ec0b2400536d"),
      "activityId": ObjectId("5c10a0e08d03ec1834001c6d"),
      "attending": "Yes",
      "shirtSize": "S",
      "id": ObjectId("5c13338032500409f4007cf3") 
      }
   ]

   1=>
     "_id": ObjectId("5bf518378d03ec0b2400536e"),
     ....
     .... 

Вложенный документ "activity_details"содержит все действия ученика.

Теперь в последней проекции я фильтрую" StudentsForSmallShirt "на основе студентовOfWeekgroup, то есть тех студентов, которые выбрали рубашкуSize:" S "и идентификатор активности присутствует в текущей проекции иweekgroupId передается в переменной $ this-> id.Фильтр "StudentsForSmallShirt" не работает.Это всегда приходит пустым.Пожалуйста, помогите !!!

Обратите внимание, что есть некоторые учащиеся, у которых активность внутри "activity_details" не содержит поля "shirtSize", а также есть некоторые учащиеся, для которых встроенный документ activity_details не назначен.

...