Я делаю вложенный запрос поиска и проекции на таблицу ученика с таблицей активности, которая дает желаемые поля, кроме одного поля, например «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 не назначен.