aggregate() public method

Perform an aggregation using the aggregation framework
public aggregate ( array $pipeline, array $op = [] ) : array
$pipeline array
$op array
return array
Beispiel #1
0
 public function getPictureTotalSize()
 {
     $result = $this->collection->aggregate([['$match' => ['-class' => $this->alias]], ['$project' => ['size' => true, '-class' => true]], ['$group' => ['_id' => '$-class', 'total' => ['$sum' => '$size']]]]);
     $total = 0;
     if ($result['ok'] == 1 && count($result['result'])) {
         $total = $result['result'][0]['total'];
     }
     return $total;
 }
Beispiel #2
0
 /**
  */
 public function favouriteRecipients($limit, $filter = null)
 {
     $query = array(self::SUCCESS => 1, self::WHO => $GLOBALS['registry']->getAuth());
     if (!empty($filter)) {
         $query[self::ACTION] = array('$in' => $filter);
     }
     $out = array();
     try {
         $res = $this->_db->aggregate(array(array('$match' => $query), array('$group' => array('_id' => '$' . self::RECIPIENT, 'count' => array('$sum' => 1))), array('$sort' => array('count' => -1)), array('$limit' => $limit)));
         if (isset($res['result'])) {
             foreach ($res['result'] as $val) {
                 $out[] = $val['_id'];
             }
         }
     } catch (MongoException $e) {
     }
     return $out;
 }
 /**
  * @param array $pipeline
  * @param array $op
  * @param null $op1
  * @return array
  */
 public function aggregate($pipeline, $op = null, $op1 = null)
 {
     $op = $op ?: [];
     if (is_array($op) && isset($op['cache']) && $op['cache'] === false) {
         unset($op['cache']);
         return parent::aggregate($pipeline, $op);
     }
     if (!isset($pipeline[0])) {
         $pipeline = func_get_args();
     }
     $hash = $this->hash($pipeline);
     $result = $this->cache->get($hash);
     if (!$result) {
         $result = parent::aggregate($pipeline, $op);
         $this->cache->set($hash, $result, $this->getCacheTime($op));
     }
     return $result;
 }
Beispiel #4
0
 /**
  * Execute the query as a fresh "select" statement.
  *
  * @param  array  $columns
  * @return array|static[]
  */
 public function getFresh($columns = array())
 {
     // If no columns have been specified for the select statement, we will set them
     // here to either the passed columns, or the standard default of retrieving
     // all of the columns on the table using the "wildcard" column character.
     if (is_null($this->columns)) {
         $this->columns = $columns;
     }
     // Drop all columns if * is present, MongoDB does not work this way.
     if (in_array('*', $this->columns)) {
         $this->columns = array();
     }
     // Compile wheres
     $wheres = $this->compileWheres();
     // Use MongoDB's aggregation framework when using grouping or aggregation functions.
     if ($this->groups or $this->aggregate) {
         $group = array();
         // Add grouping columns to the $group part of the aggregation pipeline.
         if ($this->groups) {
             foreach ($this->groups as $column) {
                 $group['_id'][$column] = '$' . $column;
                 // When grouping, also add the $last operator to each grouped field,
                 // this mimics MySQL's behaviour a bit.
                 $group[$column] = array('$last' => '$' . $column);
             }
         } else {
             // If we don't use grouping, set the _id to null to prepare the pipeline for
             // other aggregation functions.
             $group['_id'] = null;
         }
         // Add aggregation functions to the $group part of the aggregation pipeline,
         // these may override previous aggregations.
         if ($this->aggregate) {
             $function = $this->aggregate['function'];
             foreach ($this->aggregate['columns'] as $column) {
                 // Translate count into sum.
                 if ($function == 'count') {
                     $group['aggregate'] = array('$sum' => 1);
                 } else {
                     $group['aggregate'] = array('$' . $function => '$' . $column);
                 }
             }
         } else {
             foreach ($this->columns as $column) {
                 $key = str_replace('.', '_', $column);
                 $group[$key] = array('$last' => '$' . $column);
             }
         }
         // Build the aggregation pipeline.
         $pipeline = array();
         if ($wheres) {
             $pipeline[] = array('$match' => $wheres);
         }
         $pipeline[] = array('$group' => $group);
         // Apply order and limit
         if ($this->orders) {
             $pipeline[] = array('$sort' => $this->orders);
         }
         if ($this->offset) {
             $pipeline[] = array('$skip' => $this->offset);
         }
         if ($this->limit) {
             $pipeline[] = array('$limit' => $this->limit);
         }
         if ($this->projections) {
             $pipeline[] = array('$project' => $this->projections);
         }
         // Execute aggregation
         $results = $this->collection->aggregate($pipeline);
         // Return results
         return $results['result'];
     } else {
         if ($this->distinct) {
             // Return distinct results directly
             $column = isset($this->columns[0]) ? $this->columns[0] : '_id';
             // Execute distinct
             $result = $this->collection->distinct($column, $wheres);
             return $result;
         } else {
             $columns = array();
             // Convert select columns to simple projections.
             foreach ($this->columns as $column) {
                 $columns[$column] = true;
             }
             // Add custom projections.
             if ($this->projections) {
                 $columns = array_merge($columns, $this->projections);
             }
             // Execute query and get MongoCursor
             $cursor = $this->collection->find($wheres, $columns);
             // Apply order, offset and limit
             if ($this->timeout) {
                 $cursor->timeout($this->timeout);
             }
             if ($this->orders) {
                 $cursor->sort($this->orders);
             }
             if ($this->offset) {
                 $cursor->skip($this->offset);
             }
             if ($this->limit) {
                 $cursor->limit($this->limit);
             }
             // Return results as an array with numeric keys
             return iterator_to_array($cursor, false);
         }
     }
 }
Beispiel #5
0
 /**
  * Execute the query as a fresh "select" statement.
  *
  * @param  array  $columns
  * @return array|static[]
  */
 public function getFresh($columns = [])
 {
     // If no columns have been specified for the select statement, we will set them
     // here to either the passed columns, or the standard default of retrieving
     // all of the columns on the table using the "wildcard" column character.
     if (is_null($this->columns)) {
         $this->columns = $columns;
     }
     // Drop all columns if * is present, MongoDB does not work this way.
     if (in_array('*', $this->columns)) {
         $this->columns = [];
     }
     // Compile wheres
     $wheres = $this->compileWheres();
     // Use MongoDB's aggregation framework when using grouping or aggregation functions.
     if ($this->groups or $this->aggregate or $this->paginating) {
         $group = [];
         // Add grouping columns to the $group part of the aggregation pipeline.
         if ($this->groups) {
             foreach ($this->groups as $column) {
                 $group['_id'][$column] = '$' . $column;
                 // When grouping, also add the $last operator to each grouped field,
                 // this mimics MySQL's behaviour a bit.
                 $group[$column] = ['$last' => '$' . $column];
             }
             // Do the same for other columns that are selected.
             foreach ($this->columns as $column) {
                 $key = str_replace('.', '_', $column);
                 $group[$key] = ['$last' => '$' . $column];
             }
         }
         // Add aggregation functions to the $group part of the aggregation pipeline,
         // these may override previous aggregations.
         if ($this->aggregate) {
             $function = $this->aggregate['function'];
             foreach ($this->aggregate['columns'] as $column) {
                 // Translate count into sum.
                 if ($function == 'count') {
                     $group['aggregate'] = ['$sum' => 1];
                 } else {
                     $group['aggregate'] = ['$' . $function => '$' . $column];
                 }
             }
         }
         // When using pagination, we limit the number of returned columns
         // by adding a projection.
         if ($this->paginating) {
             foreach ($this->columns as $column) {
                 $this->projections[$column] = 1;
             }
         }
         // The _id field is mandatory when using grouping.
         if ($group and empty($group['_id'])) {
             $group['_id'] = null;
         }
         // Build the aggregation pipeline.
         $pipeline = [];
         if ($wheres) {
             $pipeline[] = ['$match' => $wheres];
         }
         if ($group) {
             $pipeline[] = ['$group' => $group];
         }
         // Apply order and limit
         if ($this->orders) {
             $pipeline[] = ['$sort' => $this->orders];
         }
         if ($this->offset) {
             $pipeline[] = ['$skip' => $this->offset];
         }
         if ($this->limit) {
             $pipeline[] = ['$limit' => $this->limit];
         }
         if ($this->projections) {
             $pipeline[] = ['$project' => $this->projections];
         }
         $options = ['typeMap' => ['root' => 'array', 'document' => 'array']];
         // Execute aggregation
         $results = iterator_to_array($this->collection->aggregate($pipeline, $options));
         // Return results
         return $results;
     } elseif ($this->distinct) {
         // Return distinct results directly
         $column = isset($this->columns[0]) ? $this->columns[0] : '_id';
         // Execute distinct
         if ($wheres) {
             $result = $this->collection->distinct($column, $wheres);
         } else {
             $result = $this->collection->distinct($column);
         }
         return $result;
     } else {
         $columns = [];
         // Convert select columns to simple projections.
         foreach ($this->columns as $column) {
             $columns[$column] = true;
         }
         // Add custom projections.
         if ($this->projections) {
             $columns = array_merge($columns, $this->projections);
         }
         $options = [];
         // Apply order, offset, limit and projection
         if ($this->timeout) {
             $options['maxTimeMS'] = $this->timeout;
         }
         if ($this->orders) {
             $options['sort'] = $this->orders;
         }
         if ($this->offset) {
             $options['skip'] = $this->offset;
         }
         if ($this->limit) {
             $options['limit'] = $this->limit;
         }
         if ($columns) {
             $options['projection'] = $columns;
         }
         // if ($this->hint)    $cursor->hint($this->hint);
         // Fix for legacy support, converts the results to arrays instead of objects.
         $options['typeMap'] = ['root' => 'array', 'document' => 'array'];
         // Execute query and get MongoCursor
         $cursor = $this->collection->find($wheres, $options);
         // Return results as an array with numeric keys
         return iterator_to_array($cursor, false);
     }
 }
        $productIds = [];
        foreach ($products as $product) {
            $productIds[] = $product['product_id'];
        }
        $products = $qb->select('p')->andWhere('p.id IN (:product_ids)')->setParameter(':product_ids', $productIds)->getQuery()->execute();
        break;
    case 'doctrine/mongodb-odm':
        $client = new MongoClient();
        $database = $container->getParameter('mongodb_database');
        $db = $client->{$database};
        $productCollection = new MongoCollection($db, PIM_CATALOG_PRODUCT);
        $variantGroupIds = $container->get('pim_catalog.repository.group')->getAllVariantGroupsQB()->select('g.id')->getQuery()->execute(null, AbstractQuery::HYDRATE_ARRAY);
        array_walk($variantGroupIds, function (&$value) {
            $value = $value['id'];
        });
        $selectedProducts = $productCollection->aggregate([['$unwind' => '$groupIds'], ['$match' => ['groupIds' => ['$in' => $variantGroupIds]]], ['$group' => ['_id' => '$normalizedData.' . $identifierCode, 'variant_count' => ['$sum' => 1]]], ['$match' => ['variant_count' => ['$gt' => 1]]]])['result'];
        $productIdentifiers = [];
        foreach ($selectedProducts as $product) {
            $productIdentifiers[] = $product['_id'];
        }
        $products = $container->get('pim_catalog.doctrine.query.product_query_factory')->create()->addFilter($identifierCode, 'IN', $productIdentifiers)->execute();
        break;
    default:
        throw new \LogicException(sprintf('Unknown storage driver %s (supported storage drivers : doctrine/orm and doctrine/mongodb-odm)', $storageDriver));
}
$output = new ConsoleOutput();
if (count($products) > 0) {
    $output->writeln(sprintf('%s products are in more than one variant group. This is not permitted anymore', count($products)));
    $output->writeln('Products in more than one variant group :');
    $lines = [];
    $tableHelper = new TableHelper();
 public function testPipeline()
 {
     $result = $this->collection->aggregate(['$group' => ['_id' => 'foo', 'sum' => ['$sum' => '$foo']]]);
     $this->assertEquals(4, $result['result'][0]['sum']);
 }
Beispiel #8
0
 /**
  * aggregate框架指令达成
  *
  * @return mixed
  */
 public function aggregate($pipeline, $op = NULL, $op1 = NULL)
 {
     if (!$this->_noAppendQuery) {
         if (isset($pipeline[0]['$geoNear'])) {
             $first = array_shift($pipeline);
             array_unshift($pipeline, array('$match' => array('__REMOVED__' => false)));
             array_unshift($pipeline, $first);
         } else {
             array_unshift($pipeline, array('$match' => array('__REMOVED__' => false)));
         }
     }
     return parent::aggregate($pipeline);
 }
Beispiel #9
0
function mkonegrp($db, $colname, $query, $grouparr)
{
    $ops = array();
    $ops[] = ['$match' => $query];
    //  $ops[] = ['$sort' => ['year'=> -1, 'month'=> -1]];
    $ops[] = ['$group' => $grouparr];
    $option = ['allowDiskUse' => true];
    //print_r($ops);
    $collection = new MongoCollection($db, $colname);
    echo "working on: {$colname} ... with";
    $col2name = $colname . "_agg";
    $col2 = new MongoCollection($db, $col2name);
    //print_r($grouparr['_id']);
    //makegrpIndex($db, $col2, $grouparr['_id']);
    try {
        $cursor = $collection->aggregate($ops, $option);
    } catch (MongoException $e) {
        echo "error message: " . $e->getMessage() . "\n";
        echo "error code: " . $e->getCode() . "\n";
        exit(1);
    }
    $results = $cursor['result'];
    foreach ($results as $key => $val) {
        foreach ($val as $skey => $sval) {
            if ($skey == '_id') {
                $r = $sval;
            } else {
                $r[$skey] = $sval;
            }
        }
        //print_r($r);
        $col2->insert($r);
    }
}