Код не работает должным образом для извлечения конкретного внедренного документа - PullRequest
0 голосов
/ 03 мая 2018

У меня есть коллекция HostelTbl вроде

 {
 "_id": ObjectId("5ae845b3d2ccda137000595d"),
 "Name": "abc",
 "Address": "gggswwrerghyjh",
 "NoOfFloors": NumberInt(4),
 "Approved": "Yes",
 "SchoolId": ObjectId("5a8e9025ff24ae113c005d42"),
 "RoomsDetails": [
  {
     "RoomId": "80a1761f-f8ee-a78f-c6ab-6f9bfbdb8ea3",
     "FloorNumber": "3",
     "RoomNumber": "5",
     "RoomType": ObjectId("5ae8267ed2ccda137000595b"),
     "NumberOfBeds": "4" 
   },
    {
     "RoomId": "56a1761f-f8ee-a78f-c6ab-6f9bfbdb8es3",
     "FloorNumber": "3",
     "RoomNumber": "4",
     "RoomType": ObjectId("5ae8267ed2ccda137000595b"),
     "NumberOfBeds": "5" 
   } 
   ] 
  }

Обратите внимание, что он содержит встроенный документ RoomsDetails. Теперь я хочу получить только один конкретный вложенный документ на основе RoomId

Я пытался

    public function fetchRoomById()
    {
    $cursor = $this->collection->aggregate(array(
    array(
    '$match' => array(
        "_id" => new MongoDB\BSON\ObjectID($this->id)),
    )
    ),
    array(
    '$project' => array(
        'RoomsDetails' => array(
            '$filter' => array(
                'input' => '$RoomsDetails',
                'as' => 'Rooms',
                'cond' => array(
                    '$eq' => array('$$Rooms.RoomId', $this->RoomId)
                )
            )
        ),
            )
         )
        );
    return $cursor->toArray();
}

Не возвращает сопоставленный внедренный документ, вместо основного документа возвращается основной документ.

Пожалуйста, помогите

1 Ответ

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

Я выполнил запрос фильтра в моей локальной базе данных, и он работает нормально

db.users.aggregate(


[

    {
        $project: {
          "Name": 1,
         "Address": 1,
         "NoOfFloors":1,
         "Approved": 1,
         "SchoolId":1,
           items: {
                    $filter: {
                       input: "$RoomsDetails",
                       as: "item",
                       cond: { $eq: [ "$$item.RoomId", "80a1761f-f8ee-a78f-c6ab-6f9bfbdb8ea3" ] }
                    }
                 }
        }
    },
]);
...