Конвейер поиска сообщений об ошибках должен быть строкой, это массив типов - PullRequest
0 голосов
/ 26 сентября 2018

Я использую версию mongodb 3.6.

У меня есть таблица транспортных средств с такими документами, как

   {
    "_id": ObjectId("5b976220d2ccda12fc0050fb"),
    "VehicleNumber": "JK 678",
    "NumberOfSeats": "47",
   }
   {
    "_id": ObjectId("67976220d2ccda12fc005068"),
    "VehicleNumber": "JK 779",
    "NumberOfSeats": "47",
   }

У меня есть таблица маршрутов с такими данными, как

    {
    "_id": ObjectId("5b7fb426d2ccda11fc005185"),
    "Name": "New Jersey City",
     "VehicleDetails": [
     {
        "VehicleEntryId": "b8d0d2b5-8f32-6850-4d79-34ed79138d6d",
        "VehicleId": ObjectId("5b976220d2ccda12fc0050fb"),
          ...
         "Status": "Active" 
      },
      {
      "VehicleEntryId": "b8d0d2b5-8f32-6850-4d79-34ed79138568",
      "VehicleId": ObjectId("67976220d2ccda12fc005068"),
        ...
       "Status": "Active" 
      } 
    ],
    ...
    }

У меня естьписьменный запрос агрегации mongodb, такой как

       $cursor = $this->collection->aggregate([
    ['$match' => ["_id" => new MongoDB\BSON\ObjectID('5b7fb426d2ccda11fc005185')]],
    [
        '$addFields' => [
            'filteredIds' => [
                '$map' => [
                    'input' => '$VehicleDetails',
                    'as' => 'item',
                    'in' => [
                        '$cond' => [
                            ['$eq' => ['$$item.Status', 'Active']],
                            '$$item.VehicleId',
                            false
                        ]
                    ]
                ]
            ]
        ]
    ],

     array(
            '$lookup' => array(
                'from' => 'VehicleTbl',
                '$pipeline' => [
                       [ '$match'=> ["_id" => ['$in' => ['$$filteredIds'] ]]],
                 ],
                'as' => 'AllotedVehicleDetails'
            )
        ),
])->toArray();

В основном я пытаюсь выбрать все назначенные транспортные средства для определенного маршрута.Поэтому я сначала извлекаю все активно назначенные идентификаторы транспортных средств, используя оператор $ addFeilds, и помещая их в «FilterIds», а затем при поиске пытаюсь получить информацию о транспортных средствах из таблицы транспортных средств, используя конвейер.Приведенный выше код выдает сообщение об ошибке «Неполученное исключение» MongoDB \ Driver \ Exception \ RuntimeException с сообщением «$ lookup аргумент» $ pipe: [{$ match: {_id: {$ in: ["$$ FilterIds"]}}}] 'должна быть строкой, это массив типов' в строке № 32.

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

1 Ответ

0 голосов
/ 27 сентября 2018

используйте pipeline вместо $pipeline.

Пример:

{
      $lookup : {
          'from' : 'vehicles',
           let : { localFilterIds : '$filteredIds'},
          pipeline : [
              {'$match'  : { $expr: {  '$in' : [ '$_id', '$$localFilterIds' ]  }} }
          ],
         'as' : 'AllotedVehicleDetails'
      }
  }

Примечание. Это тест в mongoDb GUI Robo 3T.

...