У меня есть рабочий агрегированный запрос MongoDB
который я могу запустить через оболочку MongoDB. Тем не менее, я пытаюсь преобразовать его для работы с официальным драйвером PHP
Mongo (http://php.net/manual/en/mongocollection.aggregate.php).
Вот рабочий необработанный запрос MongoDB:
db.executions.aggregate( [ { $project : { day : { $dayOfYear : "$executed" } } }, { $group : { _id : { day : "$day" }, n : { $sum : 1 } } } , { $sort : { _id : -1 } } , { $limit : 14 } ] )
Вот моя попытка (не работает) в PHP
с использованием драйвера Mongo:
$result = $c->aggregate(array( '$project' => array( 'day' => array('$dayOfYear' => '$executed') ), '$group' => array( '_id' => array('day' => '$day'), 'n' => array('$sum' => 1) ), '$sort' => array( '_id' => 1 ), '$limit' => 14 ));
Ошибка из приведенного выше PHP-кода:
{"errmsg":"exception: wrong type for field (pipeline) 3 != 4","code":13111,"ok":0}
Есть идеи? Благодарю.
Параметр в вашем Javascript представляет собой массив из 4 объектов с одним элементом каждый, в вашем PHP это ассоциативный массив (объект) с 4 элементами. Это будет ваш Javascript:
$result = $c->aggregate(array( array( '$project' => array( 'day' => array('$dayOfYear' => '$executed') ), ), array( '$group' => array( '_id' => array('day' => '$day'), 'n' => array('$sum' => 1) ), ), array( '$sort' => array( '_id' => 1 ), ), array( '$limit' => 14 ) ));
Кроме того, если у вас есть хотя бы PHP5.4, вы можете использовать более простой синтаксис массива. Трансформация на PHP тогда тривиальна, вы просто заменяете фигурные скобки квадратными скобками и двоеточиями со стрелками:
$result = $c->aggregate([ [ '$project' => [ 'day' => ['$dayOfYear' => '$executed'] ] ], [ '$group' => ['_id' => ['day' => '$day'], 'n' => ['$sum' => 1] ] ], [ '$sort' => ['_id' => 1] ], [ '$limit' => 14 ] ]);