【问题标题】:Filter on projection not working in mongodb过滤投影在mongodb中不起作用
【发布时间】:2018-12-14 07:46:35
【问题描述】:

我已经使用活动表对学生表进行了聚合查询,该表给出了除一个字段(即“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”字段。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 2019-11-15
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多