Необработанное исключение «MongoDB \ Driver \ Exception \ RuntimeException» с сообщением «Объект, представляющий выражение, должен иметь ровно одно поле: - PullRequest
0 голосов
/ 12 июня 2018

Я написал, как показано ниже строки кода

         $cursor = $this->collection->aggregate(array(
             array(
                   '$match' => array(
                                "_id" => new MongoDB\BSON\ObjectID($this->id)
                                )
                  ),
             array(
                  '$project' => array(
                  'AllotmentsDetails' => array(
                  '$filter' => array(
                  'input' => '$AllotmentsDetails',
                  'as' => 'allot',
                  'cond' => array(
                   '$and' => array(
                  '$lt' => array('$$allot.ToDate', new MongoDB\BSON\UTCDateTime((new DateTime())->getTimestamp() * 1000)),
                  '$eq' => array('$$allotment.RoomId', $this->RoomId)
                     )
                   )
                  )
                 ),
                )
              )
            ))->toArray();

Выдает сообщение об ошибке «Uncaught исключение» MongoDB \ Driver \ Exception \ RuntimeException »с сообщением« Объект, представляющий выражение, должен иметь ровно одно поле: "

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

1 Ответ

0 голосов
/ 12 июня 2018

Просто пропущены нотации массивов и они совпадают в некоторых неправильных местах:

$pipeline = array(
  array( '$match' => array(
    "_id" => new MongoDB\BSON\ObjectID($this->id)
  )),
  array('$project' => array(
    'AllotmentsDetails' => array(
      '$filter' => array(
        'input' => '$AllotmentsDetails',
        'as' => 'allotment',
        'cond' => array(
          '$and' => array(
            array('$lt' => array(
              '$$allotment.ToDate',
              new MongoDB\BSON\UTCDateTime((new DateTime())->getTimestamp() * 1000)
            )),
            array('$eq' => array('$$allotment.RoomId', $this->RoomId))
          )
        )
      )
    )
  ))
);

$cursor = $this->collection->aggregate($pipeline)->toArray();

или, поскольку мы находимся в современном мире, немного легче читать:

$pipeline = [
  ['$match' => [
    "_id" => new MongoDB\BSON\ObjectID($this->id)
  ]],
  ['$project' => [
    'AllotmentsDetails' => [
      '$filter' => [
        'input' => '$AllotmentsDetails',
        'as' => 'allotment',
        'cond' => [
          '$and' => [
            ['$lt' => [
              '$$allotment.ToDate',
              new MongoDB\BSON\UTCDateTime((new DateTime())->getTimestamp() * 1000)
            ]],
            ['$eq' => ['$$allotment.RoomId', $this->RoomId] ]
          ]
        ]
      ]
    ]
  ]]
];

$cursor = $this->collection->aggregate($pipeline)->toArray();

Я предлагаюлучший редактор, а также использовать json_encode() в ваших структурах данных для проверки того, что сгенерированный JSON соответствует тому, что вы видите в качестве примеров в документации.

...