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

时间:2018-12-14 07:46:36

标签: mongodb mongodb-query aggregation-framework mongodb-php php-mongodb

我已经用活动表对学生表进行了汇总查询,该表给出了除一个字段即“ 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”中的最后一个活动不包含“ shirtSize”字段。

1 个答案:

答案 0 :(得分:1)

我猜“不起作用”表示您有一个空数组。这是因为您不能仅通过“ -1”来引用数组的最后一个元素。相反,您需要使用数组运算符来获取最后一个元素。例如,它可以是arrayElemAtslice的组合,因此过滤条件可以如下所示:

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

它采用js语法,但是将其翻译为php应该很简单。