投影过滤器在 mongodb 中不起作用

Filter on projection not working in mongodb

我用 activity table 对学生 table 进行了聚合查询,它给出了除了一个字段 "ActivityForMediumSize" 之外的所需字段。此字段为空。

密码是

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

        $pipeline = array(
            array(
                '$match' => $query
            ),
            array(
                '$lookup' => array(
                    'from' => 'studentTbl',
                    'localField' => '_id',
                    'foreignField' => 'activity_details.activityId',
                    'as' => 'studentsOfActivities'
                )
            ),
           ['$lookup'=> [
               'from'=> 'studentTbl',
               'localField' => 'academic_year_Id',
               'foreignField' => 'studentsOfActivities.academic_year_Id',
               'as'=> 'Students'
            ]],
            ['$project' => [
                '_id' => 1.0,
                'activityName' => 1.0,
                'activityTime' => 1.0,
                'activityDate' => 1.0,
                'funRun' => 1.0,
                'Students' => 1.0,
                'studentsOfActivities' => 1.0,
                'studentsOfWeekgroup' => [
                    '$filter' => [
                        'input' => '$Students',
                        'as' => 'item',
                        'cond' => [
                            '$eq' => ['$$item.academic_year_Id', new MongoDB\BSON\ObjectID($this->id)],

                        ]
                    ]
                ],
                'ActivityForMediumSize' => [
                    '$filter' => [
                        'input' => '$studentsOfActivities',
                        'as' => 'item',
                        'cond' => [
                            '$eq' =>['$$item.activity_details.-1.shirtSize', 'M'],
                        ]
                    ]
                ],

                'StudentCountPerActivity'=>['$size'=>'$studentsOfActivities'],
               // 'MediumCount'=>['$size'=>'$countForMedium']
              ]], 
            );

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

我在控制台中检查过 "studentsOfActivities" 中的数据看起来像

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

嵌入式文档 "activity_details" 包含学生的所有活动,它的最后一个元素被认为是活动的,即为什么我在上面的代码中使用了 -1。

现在在投影中 "ActivityForMediumSize" 我正在尝试找到那些选择了 shirtSize 的学生:"M"。投影 "ActivityForMediumSize" 上的过滤器不起作用。请帮助!!!

请注意,有些学生在 "activity_details" 中的最后一个 activity 不包含 "shirtSize" 字段。

我想 "is not working" 意味着你有一个空数组。这是因为您不能仅通过“-1”来引用数组的最后一个元素。相反,您需要使用数组运算符来获取最后一个元素。例如它可以是 arrayElemAt and slice 的组合所以过滤条件可以是这样的:

$eq: [
    { $let: {
        vars: {
            last: { $arrayElemAt: [ 
                { $slice: [ '$$item. activity_details', -1 ] },
                0   
            ] }
        },
        in: '$$last.shirtSize'
    } },
    'M'
]

它是js语法,但翻译成php应该很简单。