Я хочу реализовать $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
@AlexBlex Я добавил свои версии.
Спасибо, первый массив явно неправильный. Последний выглядит нормально. Если вы отформатируете его для правильного php-кода, я могу попытаться воспроизвести его.
@AlexBlex Я обновил свой вопрос и добавил код для воспроизведения ошибки






Должен быть:
$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") Я получал эту ошибку раньше, пытаясь решить проблему.
если я добавлю array(), как $collection->aggregate( array($more_where) );, я снова получу A pipeline stage specification object must contain exactly one field.
Тогда вам, вероятно, потребуется добавить полный mcve. Я тестировал его с помощью mongodb / mongodb 1.4 lib. Вы его точно скопировали или что-то изменили? «Неожиданный указатель» предполагает второе.
Да скопировал точно. Я использую mongodb/mongo-php-library 1.4.2
Простите, в это сложно поверить. Вы уверены, что точно скопировали и не меняли массив? Работает в docker pull alexblex/so-52950517. cd /root, затем php test.php из контейнера.
Добавьте минимальный код PHP для воспроизведения ошибки, включая версии базы данных, php и драйвера.