Поиск на основе встроенного документа - PullRequest
0 голосов
/ 22 мая 2018

У меня есть коллекция с именем assignmentTbl, одна запись хранится как

    {
       _id : "6956GSVKU6535799",
       Type : "Project Abc",
       ...
       ...
       "TaskDetails"
        [
          { 
            "TaskId":"5759",
            "StudentId": ObjectId("5ab8845cff24ae1204000858"),
            ...
          },
          {
            "TaskId":"5659",
            "StudentId":  ObjectId("5ab8d7b1ff24ae1204000867"),
            ...
          }
          ...
        ]
    }

В studentTbl данные похожи на

   {
     "_id": ObjectId("5ab8d7b1ff24ae1204000867"),
     "profilePicture": "",
     "registration_temp_perm_no": "MGL-015",
     "admission_date": ISODate("2018-03-25T22:00:00.0Z"),
     "first_name": "Abrar",
     "middle_name": "",
     "last_name": "Khajwal",
     ...
   }
   ...
   ...

Я хочу написать запрос, который будет извлекать данные из назначениятаблица и некоторая информация об ученике (имя и фамилия) из studentTbl.Обратите внимание, что все остальные поля из studentTbl не являются обязательными.Я не могу выполнить поиск агрегации на основе встроенного документа.Пожалуйста, помогите !!!

Я пробовал приведенные ниже строки кода, и он возвращается пустым.

public function fetchAllAllotments() 
{
    $pipeline = array(
        array(
            '$lookup' => array(
                'from' => 'studentTbl',
                'localField' => '_id',
                'foreignField' => 'TaskDetails.StudentId',
                'as' => 'StudentsDetails'
            )
        ), 

        array('$match' => array('id' => new MongoDB\BSON\ObjectID($this->id)))
    );

    try
     {
        $cursor = $this->collection->aggregate($pipeline);
     } 
     catch (Exception $e) {

     }

   return $cursor->toArray();
} 

1 Ответ

0 голосов
/ 23 мая 2018

Сначала вам нужно $unwind, а затем вы можете применить $lookup stage ... и ваш localField должен быть TaskDetails.StudentId, а foreignField должен быть _id

public function fetchAllAllotments() 
{
    $pipeline = array(
        array('$match' => array('id' => new MongoDB\BSON\ObjectID($this->id))),
        array('$unwind'=>'$TaskDetails'),
        array(
            '$lookup' => array(
                'from' => 'studentTbl',
                'localField' => 'TaskDetails.StudentId',
                'foreignField' => '_id',
                'as' => 'StudentsDetails'
            )
        )
    );

    try
     {
        $cursor = $this->collection->aggregate($pipeline);
     } 
     catch (Exception $e) {

     }

   return $cursor->toArray();
} 
...