Запрос MongoDB с агрегированным конвейером по $ skip, $ limit, $ project и $ lookup вместе

Я хочу реализовать $skip, $limit, $project & $lookup вместе на одном агрегате через PHP

Мой следующий необработанный запрос MongoDB работает нормально при нажатии с терминала, и я хочу реализовать это с помощью PHP

db.getCollection("tbl_players").aggregate([

    {$skip: 10},
    {$limit: 10},
    {$project: {
        "fullname":1,
        "fullname_ar":1,
        "country.name":1,
        "country.name_ar":1,
        "country.ios2":1,
        "_id":1,
    }},
    {$lookup: {
        from: "tbl_countries",
        localField: "country_id",
        foreignField: "_id",
        as: "country"
    }}

])

Я пробовал несколько способов заставить его работать, вот два из них

Вот результат моего PHP-массива, который я передаю MongoDB\Collection::aggregate() как $pipeline.

array (size=4)
  '$skip' => int 10
  '$limit' => int 10
  '$project' => 
    array (size=6)
      '_id' => int 0
      'fullname' => int 1
      'fullname_ar' => int 1
      'country.name' => int 1
      'country.name_ar' => int 1
      'country.ios2' => int 1
  '$lookup' => 
    array (size=4)
      'from' => string 'tbl_countries' (length=13)
      'localField' => string 'country_id' (length=10)
      'foreignField' => string '_id' (length=3)
      'as' => string 'country' (length=7)

с указанным выше массивом я получил следующую ошибку

A pipeline stage specification object must contain exactly one field.

Следить за выводом массива

array (size=4)
  0 => 
    array (size=1)
      '$skip' => int 10
  1 => 
    array (size=1)
      '$limit' => int 10
  2 => 
    array (size=1)
      '$project' => 
        array (size=6)
          '_id' => int 0
          'fullname' => int 1
          'fullname_ar' => int 1
          'country.name' => int 1
          'country.name_ar' => int 1
          'country.ios2' => int 1
  3 => 
    array (size=1)
      '$lookup' => 
        array (size=4)
          'from' => string 'tbl_countries' (length=13)
          'localField' => string 'country_id' (length=10)
          'foreignField' => string '_id' (length=3)
          'as' => string 'country' (length=7)

с указанным выше массивом я получил следующую ошибку

Each element of the 'pipeline' array must be an object

Код PHP для воспроизведения ошибки

$more_where[]['$skip'] = 10;
$more_where[]['$limit'] = 10;
$more_where[]['$project'] = array(
                  '_id' => 0,
                  'fullname' => 1,
                  'fullname_ar' => 1,
                  'country.name' => 1,
                  'country.name_ar' => 1,
                  'country.ios2' => 1,
                );
$where['$lookup'] = array(
                  'from' => 'tbl_countries',
                  'localField' => 'country_id',
                  'foreignField' => '_id',
                  'as' => 'country',
                );


$collection->aggregate( array($where, $more_where) );

Вот версии моего PHP, расширения MongoDB и MongoDB

Версия PHP: 7.0.22

Версия драйвера: 1.5.1

Версия MongoDB: 3.4.7

Добавьте минимальный код PHP для воспроизведения ошибки, включая версии базы данных, php и драйвера.

Alex Blex 23.10.2018 15:50

@AlexBlex Я добавил свои версии.

Hassaan 23.10.2018 15:59

Спасибо, первый массив явно неправильный. Последний выглядит нормально. Если вы отформатируете его для правильного php-кода, я могу попытаться воспроизвести его.

Alex Blex 23.10.2018 16:11

@AlexBlex Я обновил свой вопрос и добавил код для воспроизведения ошибки

Hassaan 23.10.2018 16:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
502
1

Ответы 1

Должен быть:

$more_where = [];
$more_where[]['$skip'] = 10;
$more_where[]['$limit'] = 10;
$more_where[]['$project'] = array(
                  '_id' => 0,
                  'fullname' => 1,
                  'fullname_ar' => 1,
                  'country.name' => 1,
                  'country.name_ar' => 1,
                  'country.ios2' => 1,
                );
$more_where[]['$lookup'] = array(
                  'from' => 'tbl_countries',
                  'localField' => 'country_id',
                  'foreignField' => '_id',
                  'as' => 'country',
                );


$collection->aggregate( $more_where );

После реализации вашего решения я получил эту ошибку. $pipeline is not a list (unexpected index: "skip") Я получал эту ошибку раньше, пытаясь решить проблему.

Hassaan 24.10.2018 08:00

если я добавлю array(), как $collection->aggregate( array($more_where) );, я снова получу A pipeline stage specification object must contain exactly one field.

Hassaan 24.10.2018 08:01

Тогда вам, вероятно, потребуется добавить полный mcve. Я тестировал его с помощью mongodb / mongodb 1.4 lib. Вы его точно скопировали или что-то изменили? «Неожиданный указатель» предполагает второе.

Alex Blex 24.10.2018 13:24

Да скопировал точно. Я использую mongodb/mongo-php-library 1.4.2

Hassaan 24.10.2018 13:31

Простите, в это сложно поверить. Вы уверены, что точно скопировали и не меняли массив? Работает в docker pull alexblex/so-52950517. cd /root, затем php test.php из контейнера.

Alex Blex 25.10.2018 03:56

Другие вопросы по теме