2016-03-07 2 views
1

У меня есть этот код:Использование Результат Aggregation MongoDB в PHP

$data = $collection->aggregate(
    array( 
     '$group'=> array(
      '_id' => $fn, 
      'massi' => array(
       '$max' => $dnameth_value 
      ) 
     ) 
    ) 
); 

я выполнить этот запрос, и я хочу, чтобы получить только максимальное значение, и использовать это в переменной.


Я попробовал этот код:

$data=$collection->aggregate(array('$group'=> array('_id'=>$fn,'massi'=>array('$max'=>$dnameth_value)))); 

var_dump($data['result']); 

$func = function($value) { 
return $value->massi;}; 


$massi = array_map($func, $data['result']); 

var_dump($massi); 

Выход на изображении придают

enter image description here

ответ

0

При выполнении запроса, возвращаемое значение метода aggregate() помощник массив с двумя элементами: ok со значением double(1), а также элемент результата, содержащий массив всех документов, которые прошли через весь конвейер.

Например, если вы хотите, чтобы сгруппировать все документы по полю my_key, и вы хотите, чтобы получить максимальную dnameth_value из этой группы, и вы выполняете эту операцию агрегации

<?php 
$m = new MongoClient; 
$collection = $m->test->collection; 
$fn = '$my_key'; 
$dnameth_value = '$dnameth_value' 
$data = $collection->aggregate(
    array( 
     '$group'=> array(
      '_id' => $fn, 
      'massi' => array(
       '$max' => $dnameth_value 
      ) 
     ) 
    ) 
); 

var_dump($data['result']); 
?> 

вы должны ожидать, что результирующий массив от $data['result'] прийти в следующем виде (например):

… 
array (
    '_id' => 'value', 
    'massi' => double(13), 
), 
array (
    '_id' => 'other_value', 
    'massi' => double(9), 
), 
array (
    '_id' => 'another_value', 
    'massi' => double(4), 
), 
… 

Примечание: Поскольку структура агрегации возвращает все свои результаты в виде одного документа по сети, полный результат ограничен 16 МБ. Внутренние границы памяти также ограничены, поэтому всегда разумно ограничивать данные, поступающие через конвейер, оператором, как только сможете.


Таким образом, ваш запрос, вы в основном хотели бы, чтобы отобразить все massi значения из массива в другой переменной массива с помощью array_map():

<?php 
$m = new MongoClient; 
$collection = $m->test->collection; 
$fn = '$my_key'; 
$dnameth_value = '$dnameth_value' 
$data = $collection->aggregate(
    array( 
     '$group'=> array(
      '_id' => $fn, 
      'massi' => array(
       '$max' => $dnameth_value 
      ) 
     ) 
    ) 
); 

var_dump($data['result']); 

$func = function($value) { 
    return $value['massi']; 
}; 

$massi = array_map($func, $data['result']); 
var_dump($massi); 
?> 

Теперь предположим, что вы группируя все документы в коллекции, затем укажите значение _idnull для расчета накопленных значений для всех входных документов в целом. Полученный массив будет иметь один элемент, к которому вы можете получить доступ по его индексу:

<?php 
$m = new MongoClient; 
$collection = $m->test->collection; 
$fn = 'null'; 
$dnameth_value = '$dnameth_value' 
$data = $collection->aggregate(
    array( 
     '$group'=> array(
      '_id' => $fn, 
      'massi' => array(
       '$max' => $dnameth_value 
      ) 
     ) 
    ) 
); 

var_dump($data['result']); 

$massi = $data['result'][0]['massi']; 
var_dump($massi); 
?> 
+0

Спасибо. Я использую этот код: var_dump ($ data ['result']); $ massi = array_values ​​($ data ['result']) [0] -> massi; var_dump ($ massi); Первый var_dump в порядке, но второй var_dump return NULL – bomberdini

+0

Собираете ли вы все документы в коллекции? – chridam

+0

Да, я группирую все документы – bomberdini

Смежные вопросы